没有-O标志,Python会做什么优化?

Jas*_*ker 4 python optimization bytecode

我一直认为Python解释器在没有-O标志的情况下没有进行优化,但以下内容有点奇怪:

>>> def foo():
...     print '%s' % 'Hello world'
...
>>> from dis import dis 
>>> dis(foo)
  2           0 LOAD_CONST               3 ('Hello world')
              3 PRINT_ITEM          
              4 PRINT_NEWLINE       
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE        
Run Code Online (Sandbox Code Playgroud)

似乎解释器在两个字符串常量的模数上做了一些折叠.如果我添加一个变量,它会给出一个未经优化的结果:

>>> def foo():
...     s = 'Hello world!'
...     print '%s' % s
... 
>>> dis(foo)
  2           0 LOAD_CONST               1 ('Hello world!')
              3 STORE_FAST               0 (s)

  3           6 LOAD_CONST               2 ('%s')
              9 LOAD_FAST                0 (s)
             12 BINARY_MODULO       
             13 PRINT_ITEM          
             14 PRINT_NEWLINE       
             15 LOAD_CONST               0 (None)
             18 RETURN_VALUE        
Run Code Online (Sandbox Code Playgroud)

没有-O标志,Python会做什么优化?有没有办法禁用它们?我想看看未经优化的Python字节码看起来如何.我不打算在任何生产类型环境中执行此操作.

Ale*_*lli 9

是的,它确实做了常数折叠,这是一个更简单的例子:

>>> def f(): return 23+100
... 
>>> dis.dis(f)
  1           0 LOAD_CONST               3 (123)
              3 RETURN_VALUE        
>>> 
Run Code Online (Sandbox Code Playgroud)

无法阻止这种情况(除非通过更改来源)AFAIK.

编辑:对于所有优化流程,请参阅peephole.c - 这也可能是"更改源"的最方便的地方,例如更改第320行

if (codelen > 32700)
Run Code Online (Sandbox Code Playgroud)

if (codelen > 0)
Run Code Online (Sandbox Code Playgroud)

确保无条件禁用所有优化.