Python新的AST优化器

3

从Python 3.7的新功能中可以看到,常量折叠已经从Peephole优化器移动到了新的AST优化器中,这样能够更加一致地进行优化。

新的AST优化器能够执行哪些优化,并与Peephole优化器有何不同?

1个回答

4
如果您阅读相关的错误报告,它们包含了大部分细节。其中大部分内容对于大多数代码来说都是无关紧要的干巴巴的东西,这也是为什么它们没有在“新特性”中包含这些细节的原因。
只有在发生罕见的奇怪情况时,才会出现重要性,但这是基于Python 3.6上的低级别优化器(仅能进行简单的字节码重写)无法处理的情况。
>>> import dis
>>> dis.dis('if True: pass')  # Recognizes simple case and omits whole block
  1           0 LOAD_CONST               0 (None)
              2 RETURN_VALUE
>>> dis.dis('if True and 1: pass')  # Can't recognize more complex case
  1           0 LOAD_CONST               0 (True)
              2 POP_JUMP_IF_FALSE        8
              4 LOAD_CONST               1 (1)
              6 POP_JUMP_IF_FALSE        8
        >>    8 LOAD_CONST               2 (None)
             10 RETURN_VALUE

相比之下,在3.7版本中:

>>> import dis
>>> dis.dis('if True: pass')  # Recognizes simple case and omits whole block
  1           0 LOAD_CONST               0 (None)
              2 RETURN_VALUE
>>> dis.dis('if True and 1: pass')  # Handles more complex case too
  1           0 LOAD_CONST               0 (None)
              2 RETURN_VALUE

那并不有趣,它能否/将会进行更多的优化,例如函数内联或循环展开?函数内联将是一个重要的补充。 - AmjadHD
@AmjadHD:不。 CPython 不会(在可预见的未来)执行任何这种类型的激进优化。就像我所说,这个原因是新版本没有得到重点推广的原因;它基本上只是确保应用了更一致的基本优化。 - ShadowRanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接