【问题标题】:Interpreter optimization in PythonPython 中的解释器优化
【发布时间】:2014-08-12 01:13:19
【问题描述】:

假设我在x 中有一个字符串,Python 解释器是否足够聪明,知道:string.replace(x, x) 应该转换为NOP

我怎样才能找到这个?是否有任何参考资料表明解释器能够根据句法分析动态进行哪些类型的优化?

【问题讨论】:

    标签: python string optimization


    【解决方案1】:

    不,Python 不能对 NOP 做出假设;它无法在编译时知道 string 是什么类型的对象,也无法在整个程序运行期间保持该类型。

    在编译时应用了一些优化,主要是在 peephole optimiser 中。这会执行以下操作:

    • 将成员资格测试中使用的 listset 文字替换为不可变的等价物;这仅在未分配文字对象时才有效,仅在比较中使用;例如:

      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 模块反汇编示例来探索编译时优化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2017-07-10
    • 2019-05-03
    • 1970-01-01
    • 2020-10-20
    • 2021-09-21
    相关资源
    最近更新 更多