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字节码看起来如何.我不打算在任何生产类型环境中执行此操作.
是的,它确实做了常数折叠,这是一个更简单的例子:
>>> 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)
确保无条件禁用所有优化.