41

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

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

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

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

4

8 回答 8

22

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

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

2) Psyco 编译实际上会损害性能。再次来自用户指南(“已知错误”部分):

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

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

3) 最后,在一些相对隐蔽的情况下,使用 Psyco 实际上会引入错误。其中一些在此处列出

于 2009-09-17T10:23:30.663 回答
6

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

另请参阅注意事项部分。举一个困难的例子,我注意到我的带有 Cheetah 生成的模板和 DB I/O 的 Web 应用程序没有获得明显的加速。

于 2009-02-22T18:45:14.390 回答
5

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

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

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

于 2009-02-22T18:26:25.090 回答
4

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

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

于 2009-02-22T18:39:53.093 回答
4

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

于 2012-09-17T20:53:44.447 回答
3

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

于 2009-02-23T02:43:57.673 回答
2

其他几件事:

  1. 它似乎没有得到非常积极的维护。
  2. 它可能是一个记忆猪。
于 2009-03-07T00:14:22.177 回答
1

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

于 2009-02-22T21:24:38.593 回答