【问题标题】:What are the implications of running python with the optimize flag?使用优化标志运行 python 的含义是什么?
【发布时间】:2011-02-19 07:07:14
【问题描述】:

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

【问题讨论】:

标签: python optimization


【解决方案1】:

assert 语句被完全消除,if __debug__: ... 形式的语句块也是如此(因此您可以将调试代码放在此类语句块中,只需使用 -O 运行即可避免该调试代码)。

使用-OO,此外,文档字符串也被消除了。

【讨论】:

  • @RamRachum 是的。我已提交对此问题的修改以提供更多详细信息。
  • 仅供参考,当在 shebang 标头中使用 -OO 时,它通常带有指向 Python 解释器的显式路径。如果您习惯于在诸如 virtualenv 之类的“环境”中运行脚本,这可能会让您大吃一惊——导入错误等,直到您意识到发生了什么。需要明确的是,这是路径的影响,而不是 -OO。
【解决方案2】:

来自the docs

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

将两个 -O 标志传递给 Python 解释器 (-OO) 将导致 要执行的字节码编译器 一些罕见的优化 导致故障的情况 程式。目前只有__doc__ 字符串从字节码中删除, 导致更紧凑的 .pyo 文件。 由于某些程序可能依赖于 这些可用,你应该只使用 如果你知道你是什么,这个选项 做。

程序在以下情况下不会运行得更快 它是从 .pyc 或 .pyo 文件中读取的 比从 .py 文件中读取时; 唯一更快的事情 .pyc 或 .pyo 文件是速度 它们被加载了。

也就是说,几乎没有。

【讨论】:

    【解决方案3】:

    来自What does the -O flag do?

    这在某种程度上取决于 Python 版本。准确地找出它是什么 可以,搜索源代码 Py_OptimizeFlag。在 2.5 中,它

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

    【讨论】:

      【解决方案4】:

      正如python optimization mode 中的回答:

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

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

      当被称为 python -OO

      • 从代码中删除文档字符串

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

      【讨论】:

      • 请注意,此答案与我在 2010 年 1 月 13 日的that 问题中的答案完全相同;在他对这个问题的回答中,Alex Martelli 没有提到 if __debug__ 构造,这就是为什么我在这里的回答似乎不合适(我的“为什么每个人都忘记提及”)。
      猜你喜欢
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 2020-06-18
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      相关资源
      最近更新 更多