为啥不总是将 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 会减慢代码而不是加速代码的情况。很难列出可能的原因的完整列表,但这里有一些常见的原因:
必须避免使用内置的map
和filter
函数并将其替换为列表解析。例如,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 代码?的主要内容,如果未能解决你的问题,请参考以下文章
寻找 Psyco 的良好替代品(Python->C 编译器)[关闭]