为啥不总是将 psyco 用于 Python 代码?

Posted

技术标签:

【中文标题】为啥不总是将 psyco 用于 Python 代码?【英文标题】:Why not always use psyco for Python code?为什么不总是将 psyco 用于 Python 代码? 【发布时间】:2009-02-22 18:23:50 【问题描述】:

psyco 似乎对优化 Python 代码很有帮助,而且它以一种非侵入性的方式进行。

因此,人们不得不怀疑。假设您始终使用 x86 架构(这是当今大多数应用程序运行的地方),为什么不总是对所有 Python 代码使用 psyco 呢?它有时会出错并破坏程序的正确性吗?增加一些奇怪情况的运行时间?

你有过负面的经历吗?到目前为止,我最消极的经历是它使我的代码速度仅提高了 15%。通常会更好。

当然,使用 psyco 并不能替代高效的算法和编码。但是,如果您能以两行代码(导入和调用 psyco)的代价提高代码的性能,我认为没有什么不这样做的好理由。

【问题讨论】:

【参考方案1】:

1) 内存开销是主要开销,如其他答案中所述。您还需要支付编译成本,如果您没有选择性,这可能会令人望而却步。来自user reference:

对于中型或大型应用程序而言,编译所有内容通常是多余的。编译过多的缺点在于编译所花费的时间,以及该进程消耗的内存量。这是一个微妙的平衡。

2) Psyco 编译实际上会损害性能。再次来自用户指南("known bugs" 部分):

还有性能错误:Psyco 会减慢代码而不是加速代码的情况。很难列出可能的原因的完整列表,但这里有一些常见的原因:

必须避免使用内置的mapfilter 函数并将其替换为列表解析。例如,map(lambda x: x*x, lst) 应替换为更易读但更新的语法[x*x for x in lst]。 正则表达式的编译似乎没有从 Psyco 中受益。 (正则表达式的执行不受影响,因为它是 C 代码。)不要在这个模块上启用 Psyco;如有必要,明确禁用它,例如致电psyco.cannotcompile(re.compile)

3) 最后,在一些相对模糊的情况下,使用 Psyco 实际上会引入错误。其中一些是listed here。

【讨论】:

【参考方案2】:

Psyco 当前使用大量内存。 它仅在与 Intel 386 兼容的系统上运行 处理器(在任何操作系统下)现在。 有一些微妙的语义 与方式的差异(即错误) Python 工作;他们不应该 在大多数程序中都很明显。

另请参阅caveats section。举一个困难的例子,我注意到我的 web 应用程序使用 Cheetah 生成的模板和 DB I/O 并没有获得明显的加速。

【讨论】:

【参考方案3】:

在使用 pyglet 时,我发现我无法在整个应用程序上使用 psyco,而不会使我的应用程序无法运行。当然,我可以在一小段数学繁重的代码中使用它,但这不是必需的,所以我没有打扰。

此外,psyco 对我的分析结果做了一些奇怪的事情(例如,完全不改变非 psyco 版本的结果)。我怀疑它不适合分析代码。

除非我真的想要速度,否则我不会真正使用它,这并不常见。我的首要任务是算法优化,这通常会带来更好的加速。

【讨论】:

【参考方案4】:

这也取决于你的瓶颈在哪里。我主要在做网络应用程序,瓶颈可能是更多的 IO 和数据库。所以你应该知道在哪里优化。

还要注意,也许您应该首先考虑您的代码,而不是直接将 psyco 扔给它。所以我同意 Devin 的观点,即算法优化应该放在首位,它们产生不良副作用的机会可能更小。

【讨论】:

+1:您需要知道在哪里进行优化。如果您有错误的算法,Psyco 将无济于事。如果您有正确的算法,那么 Psyco 就无关紧要了。【参考方案5】:

psyco 已死,不再维护。是时候再找一个了

【讨论】:

【参考方案6】:

永远不应该依靠一些灵丹妙药来解决您的问题。通常不需要使用 psyco 使慢速程序更快。糟糕的算法可以重写,需要速度的部分可以用另一种语言编写。当然,您的问题是问我们为什么不使用它来提高速度,并且使用 psyco 时会有一些开销。 Psyco 使用内存,当您查看这两行代码时,感觉就像是开销。至于我为什么不使用 psyco 的个人原因,那是因为它不支持 x86_64,我认为这是新的新兴架构(尤其是 2038 迟早会到来)。我的替代方案是 pypy,但我也不完全喜欢它。

【讨论】:

【参考方案7】:

其他几件事:

    它似乎没有得到非常积极的维护。 它可能会占用内存。

【讨论】:

【参考方案8】:

很简单:“因为代码已经足够快了”。

【讨论】:

以上是关于为啥不总是将 psyco 用于 Python 代码?的主要内容,如果未能解决你的问题,请参考以下文章

用于 64 位机器的 psyco 替代品

将 Psyco 移植到 64 位可能存在哪些缺陷?

寻找 Psyco 的良好替代品(Python->C 编译器)[关闭]

在分发中包含 Psyco 文件

将使用 Psyco 的 Python 应用程序移植到 Mac

我使用 Python 2.7、Windows 7 64 位——Psyco 的替代品?