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

时间:2009-02-22 18:23:50

标签: python optimization psyco

psyco似乎在优化Python代码方面非常有用,而且它以非侵入性的方式完成。

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

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

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

8 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:6)

  

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

另见caveats section。举一个简单的例子,我注意到我的网络应用程序使用Cheetah生成的模板和DB I / O没有获得明显的加速。

答案 2 :(得分:5)

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

另外,psyco用我的分析结果做了一些奇怪的事情(例如,好吧,根本不用非psyco版本改变它们)。我怀疑它与分析代码不一致。

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

答案 3 :(得分:4)

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

还要注意,也许你首先应该考虑你的代码,而不是直接抛出psyco。因此,我同意Devin的观点,即算法优化应该是第一位的,它们可能会产生不必要的副作用。

答案 4 :(得分:4)

psyco死了,不再维持。是时候找到另一个

答案 5 :(得分:3)

不应该依靠一些魔法来解决你的问题。通常不需要使用psyco来使程序更慢。可以重写错误的算法,需要速度的部分可以用另一种语言编写。当然,你的问题问我们为什么不使用它来提高速度,当你使用psyco时会有一些开销。 Psyco使用内存,当你看它们时,这两行只是像开销一样感觉感觉。至于我为什么不使用psyco的个人原因,这是因为它不支持x86_64,我认为它是新的即将到来的架构(尤其是2038迟早会接近)。我的替代品是pypy,但我也不完全喜欢它。

答案 6 :(得分:2)

其他一些事情:

  1. 似乎没有积极维护。
  2. 这可能是记忆生长。

答案 7 :(得分:1)

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