gpt4 book ai didi

python - Python 在没有 -O 标志的情况下做了哪些优化?

转载 作者:太空狗 更新时间:2023-10-30 02:06:40 25 4
gpt4 key购买 nike

我一直认为 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

看起来好像解释器正在对两个字符串常量的模进行一些折叠。如果我在其中添加一个变量,它会给出未优化的结果:

>>> 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

Python 在没有 -O 标志的情况下做了哪些优化?有什么办法可以禁用它们吗?我想看看未经优化的 Python 字节码会是什么样子。我不打算在任何生产类型环境中执行此操作。

最佳答案

是的,它确实进行常量折叠,这是一个更简单的例子:

>>> def f(): return 23+100
...
>>> dis.dis(f)
1 0 LOAD_CONST 3 (123)
3 RETURN_VALUE
>>>

没有办法阻止这个(除非改变来源)AFAIK。

编辑:所有优化流程,参见peephole.c -- 这也可能是“更改源”最方便的地方,例如将第 320 行从

if (codelen > 32700)

if (codelen > 0)

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

关于python - Python 在没有 -O 标志的情况下做了哪些优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2038481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com