【问题标题】:What does Python optimization (-O or PYTHONOPTIMIZE) do?Python 优化(-O 或 PYTHONOPTIMIZE)有什么作用?
【发布时间】:2011-06-14 05:01:24
【问题描述】:

文档只说 Python 解释器执行“基本优化”,没有详细说明。显然,它依赖于实现,但有什么方法可以了解可以优化哪些类型的东西,以及它可以节省多少运行时间?

使用 -O 有什么缺点吗?

我唯一知道的是 -O 会禁用 assert,但大概不应该将 assert 用于生产中仍然可能出错的事情。

【问题讨论】:

标签: python optimization python-3.x


【解决方案1】:

在 Python 2.7 中,-O 具有以下效果:

另外-OO还有以下作用:

要验证不同版本的 CPython 的效果,请用 grep 查找 Py_OptimizeFlag 的源代码。

官方文档链接:https://docs.python.org/2.7/tutorial/modules.html#compiled-python-files

【讨论】:

  • 除了缺少内置调试信息之外,-O 标志还有什么缺点吗?
  • 我见过许多假设 docstrings 可用的 python 模块,如果使用该优化级别会中断,例如在我工作的公司,原始 sql 放在 docstrings 中,并由函数装饰器的方式(甚至不是开玩笑)。不太常见的是,assert 用于执行逻辑功能,而不是仅仅声明代码中某个点的不变期望,因此任何类似的代码也会中断。
  • @max:如果您仔细阅读上述语义更改的完整列表:您是否认为其中任何一个是“不利因素”?如果没有,则没有缺点。我个人认为字节码文件的名称更改是一个缺点——它会导致磁盘混乱。请注意,“缺少内置调试信息”在列表中不是; pdb 继续正常工作(在早期的 Python 版本中情况并非如此,其中 -O 放弃了对 pdb 中的单步执行的支持)。
  • @max:总的来说,我预计速度不会有任何显着变化。优化字节码最初是为了去掉单步执行所需的低效 SETLINENO 字节码指令。但是,自从使用更有效的方法重新实现单步之后,-O 就失去了意义。
  • 至少在当前的 CPython 版本中,__debug__ 不只是更改为Falseif __debug__ 下的任何代码都被完全删除。
猜你喜欢
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 2022-11-08
  • 2011-12-27
  • 1970-01-01
  • 2011-10-05
相关资源
最近更新 更多