【发布时间】:2011-02-19 07:07:14
【问题描述】:
我似乎找不到一个很好的简单解释,说明 python 在使用 -O 或优化标志运行时有何不同。
【问题讨论】:
-
python optimized mode 的可能重复项
标签: python optimization
我似乎找不到一个很好的简单解释,说明 python 在使用 -O 或优化标志运行时有何不同。
【问题讨论】:
标签: python optimization
assert 语句被完全消除,if __debug__: ... 形式的语句块也是如此(因此您可以将调试代码放在此类语句块中,只需使用 -O 运行即可避免该调试代码)。
使用-OO,此外,文档字符串也被消除了。
【讨论】:
来自the docs:
当 Python 解释器被调用时 使用 -O 标志,优化的代码是 生成并存储在 .pyo 文件中。 优化器目前没有帮助 很多;它只删除断言 陈述。当使用 -O 时,所有 字节码被优化; .pyc 文件是 忽略和 .py 文件被编译为 优化的字节码。
将两个 -O 标志传递给 Python 解释器 (-OO) 将导致 要执行的字节码编译器 一些罕见的优化 导致故障的情况 程式。目前只有
__doc__字符串从字节码中删除, 导致更紧凑的 .pyo 文件。 由于某些程序可能依赖于 这些可用,你应该只使用 如果你知道你是什么,这个选项 做。程序在以下情况下不会运行得更快 它是从 .pyc 或 .pyo 文件中读取的 比从 .py 文件中读取时; 唯一更快的事情 .pyc 或 .pyo 文件是速度 它们被加载了。
也就是说,几乎没有。
【讨论】:
这在某种程度上取决于 Python 版本。准确地找出它是什么 可以,搜索源代码 Py_OptimizeFlag。在 2.5 中,它
- 导致解释器加载 .pyo 文件,而不是 .pyc 文件(在 .zip 文件中, 只是让 .pyo 优先于 .pyc)
- 导致
__debug__的值为0- 忽略源代码中的断言语句
- 将
__debug__静态视为0- 导致字节码生成器保存 .pyo 文件,而不是 .pyc
【讨论】:
正如python optimization mode 中的回答:
python -O 当前执行以下操作:
__debug__ 设置为 False(默认为 True)当被称为 python -OO
不知道为什么大家忘了提__debug__这个问题;也许是因为我是唯一一个使用它的人 :) if __debug__ 构造在 -O 下运行时根本不会创建字节码,我发现这非常有用。
【讨论】:
if __debug__ 构造,这就是为什么我在这里的回答似乎不合适(我的“为什么每个人都忘记提及”)。