使用optimize标志运行python有什么含义?

kku*_*sik 32 python optimization

我似乎无法找到一个简单的解释,说明在运行-O或优化标志时python的作用有何不同.

Ale*_*lli 28

assert语句被完全消除,表单的语句块也是if __debug__: ...如此(因此您可以将调试代码放在这样的语句块中,并运行-O以避免调试代码).

随着-OO,另外,文档字符串也被淘汰.


ire*_*ses 24

来自文档:

使用-O标志调用Python解释器时,会生成优化代码并将其存储在.pyo文件中.优化器目前没有多大帮助; 它只删除断言语句.当使用-O时,所有字节码都被优化; .pyc文件被忽略,.py文件被编译为优化的字节码.

将两个-O标志传递给Python解释器(-OO)将导致字节码编译器执行优化,在某些极少数情况下可能导致程序出现故障.目前只__doc__ 从字节码中删除字符串,从而产生更紧凑的.pyo文件.由于某些程序可能依赖于这些程序可用,因此如果您知道自己在做什么,则应该只使用此选项.

从.pyc或.pyo文件读取程序时,程序运行速度不比从.py文件读取时运行速度快; 关于.pyc或.pyo文件,唯一更快的是它们加载的速度.

换句话说,几乎没有.


joa*_*uin 8

-O标志做什么?

它在某种程度上取决于Python版本.要准确了解它的作用,请搜索Py_OptimizeFlag的源代码.在2.5,它

  • 导致解释器加载.pyo文件,而不是.pyc文件(在.zip文件中,只是使.pyo优先于.pyc)
  • 导致__debug__值为0
  • 忽略源代码中的断言语句
  • __debug__静态为0
  • 导致字节码生成器保存.pyo文件,而不是.pyc


tzo*_*zot 5

正如在python优化模式中所回答:

python -O目前执行以下操作:

  • 完全忽略了断言
  • 将特殊内置名称设置__debug__为False(默认情况下为True)

当被称为python -OO时

  • 从代码中删除docstrings

我不知道为什么每个人都忘记提到这个__debug__问题; 也许是因为我是唯一一个使用它的人:)一个if __debug__构造在运行时根本不创建字节码-O,我发现它非常有用.