假设我在 x
中有一个字符串,Python 解释器是否足够聪明,知道:string.replace(x, x)
应该转换为 NOP
?
我怎样才能找到它?是否有任何引用资料表明解释器能够根据句法分析动态执行哪种类型的优化?
最佳答案
不,Python 不能对 NOP 做出假设;它无法在编译时知道对象 string
是什么类型,也无法在程序运行期间保持该类型。
在编译时应用了一些优化,主要是在 peephole optimiser 中.这会执行以下操作:
将成员资格测试中使用的
list
和set
文字替换为不可变的等价物;这仅在未分配文字对象时有效,仅用于比较;例如:if foo in ['spam', 'ham', 'eggs']:
替换为
if foo in ('spam', 'ham', 'eggs'):
用结果代替简单的计算:
one_week = 7 * 24 * 60 * 60
替换为
one_week = 604800
序列也会发生这种情况;
'neener' * 3
替换为该乘法的结果,前提是生成的序列保持在 21 个元素以下。
这些优化之所以成为可能,是因为它涉及不可变的字面值;完全受解释器控制的常量值,可以依赖它们在执行过程中不会切换类型。
关于python - Python 中的解释器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25248595/