psyco似乎在优化Python代码方面非常有用,它以非侵入性的方式实现.
因此,人们不得不怀疑.假设你总是在x86架构上(这是大多数应用程序运行的地方),为什么不总是使用psyco
所有Python代码呢?它有时会出错并破坏程序的正确性吗?增加一些奇怪案例的运行时间?
你有任何负面经历吗?到目前为止,我最负面的经验是它使我的代码速度提高了15%.通常它会更好.
当然,使用psyco并不能替代有效的算法和编码.但是,如果您可以通过两行(导入和调用psyco)的成本来提高代码的性能,我认为没有充分的理由不这样做.
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实际上会引入错误.其中一些列在这里.
Psyco目前使用大量内存.它现在只在兼容Intel 386的处理器(在任何操作系统下)上运行.与Python的工作方式有一些微妙的语义差异(即错误); 它们在大多数程序中都不应该显而易见.
另见警告部分.举一个简单的例子,我注意到我的网络应用程序使用Cheetah生成的模板和DB I/O没有获得明显的加速.
当使用pyglet时,我发现我无法在整个应用程序上使用psyco而不会使我的应用程序无法正常运行.当然,我可以在数学繁重的代码的小部分中使用它,但它没有必要,所以我没有打扰.
另外,psyco用我的分析结果做了一些奇怪的事情(例如,好吧,根本不是从非psyco版本改变它们).我怀疑它与分析代码不一致.
我只是不真正使用它,除非我真的想要速度,这不是经常.我的优先事项是算法优化,这通常会带来更好的加速.