【问题标题】:Programmatic control of python optimization?python优化的程序化控制?
【发布时间】:2009-07-07 13:06:14
【问题描述】:

我一直在玩pyglet。这是很不错的。但是,如果我运行我的代码,它位于一个可执行文件(称为 game.py)中,前缀通常为

#!/usr/bin/env python

通过做

./game.py

那就有点笨拙了。但是如果我用

运行它
python -O ./game.py

PYTHONOPTIMIZE=1 ./game.py

然后它的超级光滑。

我不在乎为什么它在没有优化的情况下运行缓慢; pyglet 的文档提到优化会禁用大量断言以及 OpenGL 的错误检查,我很乐意将其保留在此。

我的问题是:分发 Python 代码的人如何确保最终用户(对调试或修改代码的兴趣为零)运行代码的优化版本。除了告诉人们确保他们在发行说明中使用优化(他们可能无论如何都不会阅读)之外,肯定有更好的方法吗?

在 Linux 上,我可以轻松地提供一个 ./game 脚本来为最终用户运行该文件:

#!/bin/sh
PYTHONOPTIMIZE=1 ./game.py $*

但这不是很跨平台。

我有一个想法,我应该能够将 #! 行更改为

#!/usr/bin/env PYTHONOPTIMIZE=1 python

#!/usr/bin/env python -O

但这些似乎没有按预期工作,我不确定它们在 Windows 上会做什么。

是否有某种方法可以从我不知道的代码中控制优化? 比如:

  import runtime
  runtime.optimize(True)

发布多平台 Python 代码的人们认为该领域的最佳实践是什么?

【问题讨论】:

  • 这不是一个答案,因为 S.Lotts 的答案是完全正确且详尽的。使用 game.sh 和 game.bat,它可以工作。但只是一个评论:#! line 在 Windows 上完全没有任何作用,它完全被忽略了。

标签: python optimization pyglet multiplatform


【解决方案1】:

“在 Linux 上,我可以轻松地提供一个 ./game 脚本来为最终用户运行文件:”

正确。

“但这不是很跨平台。”

对了一半。有两种 shell 语言很重要。标准 Linux "sh" 和非标准 Windows "bat" (a/k/a cmd.exe),这就是现在的全部。 [当我还是个孩子的时候,有 Open VMS DCL 和 Data General 的怪异 shell 语言和 RSX-11 以及各种很棒的东西。感谢上帝的 Posix 标准。]

game.sh

python -O game.py

game.bat

python -O game.py

有趣的是,文件是相同的,只是扩展名(和文件格式)必须更改以使各种操作系统都满意。

如果您想要真正一刀切跨平台,您必须记住 Python 是一种 shell 语言。这种东西也行。

游戏启动.py

import subprocess
subprocess.Popen( "python -O game.py" )

【讨论】:

  • 谢谢!当问题有一个很好的简单解决方案时,我喜欢它。
【解决方案2】:

回答您的问题(与解决您的问题相反,S. Lott 做得很好),我认为很多时候分发 Python 代码的人并不担心这一点,因为优化标志很少有任何效果。我相信 Pyglet 是我多年来使用 Python 所听到的唯一例外。引用Python docs“优化器目前没有多大帮助;它只会删除断言语句”。

【讨论】:

  • 同样:这是我第一次看到优化标志对任何 python 代码有任何明显的影响。导致我提出问题的代码使用了大量“立即模式”GL 调用;我怀疑(尚未检查)pyglet 为每个单独的断言做了各种断言(可能包括 glGetError),所有这些都加起来。
  • 但是 -OO 会删除所有文档字符串,这可能会导致意外。 Matplotlib 使用以编程方式构建的文档字符串,例如%s 在用 f.__doc__ = f.__doc__ % kwdict 替换的文档字符串中转义,这在使用 -OO 运行时会导致错误。
猜你喜欢
  • 2020-04-16
  • 2018-10-28
  • 2021-09-28
  • 2023-02-09
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多