【发布时间】:2014-08-12 01:13:19
【问题描述】:
假设我在x 中有一个字符串,Python 解释器是否足够聪明,知道:string.replace(x, x) 应该转换为NOP?
我怎样才能找到这个?是否有任何参考资料表明解释器能够根据句法分析动态进行哪些类型的优化?
【问题讨论】:
标签: python string optimization
假设我在x 中有一个字符串,Python 解释器是否足够聪明,知道:string.replace(x, x) 应该转换为NOP?
我怎样才能找到这个?是否有任何参考资料表明解释器能够根据句法分析动态进行哪些类型的优化?
【问题讨论】:
标签: python string optimization
不,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 个元素以下。
这些优化是可能的,因为它涉及不可变的文字值;完全受解释器控制的常量值,可以依赖它不会在执行中途切换类型。
【讨论】:
dis 模块反汇编示例来探索编译时优化。