Psyco令人惊叹when it works。但是,如果没有转向32位版本的Python,看起来我们不会得到64位版本anytime soon。是否有任何替代psyco可以加速CPU绑定的一般python代码?
答案 0 :(得分:5)
答案是使用PyPy代替。来自http://psyco.sourceforge.net/introduction.html:
我2006年的计划是将Psyco中实施的技术移植到PyPy。
二月份的PyPy blog post:
...亮点和pypy的状态:
*大多数Python基准测试的运行速度比CPython或Psyco更快 *现实世界的PyPy编译器工具链本身(200个KLocs)的运行速度是原来的两倍 *支持x86 32和64bit,正在支持ARM
...
答案 1 :(得分:2)
PyPy并不是Psyco的一个方便替代品,只是为了提高瓶颈代码的速度。它的另一个生态系统。
使用PyPy有许多含义,为更大的项目提出了许多兼容性问题,并且是一个普遍的决定:它意味着切换到一个完全不同的Python实现远离引擎盖和& Python领导者开发人员的质量保证水平。 PyPy在大多数真正的单词项目中的速度提升相当over-hyped。初步执行需要很长时间。内存占用空间巨大且难看。所提出的基准是选择"。并且总是有一些项目所需的库,或GUI /服务器/ IDE /调试问题,它们会完全停止显示,或者使开发和放大倍增。调试时间。速度增加很难预测,很难通过聚焦来调整。没什么好感觉的。
今天在CPython中加速瓶颈代码的成熟替代方案是Cython和numba。 (还有其他" mayflies" here)
Numba ,一个用于CPython的JIT编译器库(和Psyco一样),专注于数字代码。只需在瓶颈函数上放置一个jit
函数装饰器,它就能提供令人印象深刻的速度提升(10..200x,超过psyco / PyPy)。它开箱即用,并与numpy
阵列结合使用! (与Psyco不同);然而到目前为止,Numba没有做任何事情,甚至放慢了其他正常的python代码,这些代码主要适用于对象属性,字符串片段,通用列表,dicts等。(最糟糕的是:速度为0.04倍,比Psyco差)。与Psyco不同,Numba是一个巨大的安装,并且导入缓慢(绘制numpy)。但它也可以从选定的函数创建预编译的静态模块,然后不再需要numba安装进行部署(类似于Cython)。
Cython ,Python& C类混合语言静态编译器(Python语言的超集)采用C编译器管道并生成DLL模块,通常通过将一些瓶颈函数重构为单独的模块来使用。 但即使未更改的更大的Python模块是Cython编译,这通常会产生大约2倍的速度增益,只是如此"免费"!然而,那些编译的DLL模块明显大于.pyc / .pyo-s。 Cython所以说Python字节代码展开成直接的C函数调用。它对常量等做了一些进一步的优化。 (Wheezy.web的pip安装,例如默认情况下,在没有警告的情况下以无耻的方式Cython化其所有代码 - 这使得在开发过程中调试和检查变得困难)
除了"免费"通过将一些Cython静态类型声明放入热点Python代码中,可以通过相当简单的方式实现未改变代码的速度增益,进一步的巨大速度增加(接近C速度),特别是对于数字/数组代码和一些OO工作。 C速度字符串处理需要更多涉及的编码。
Cython允许通过专注于瓶颈并使用Cython类型以细粒度方式无缝调整代码来持续提高C速度。这是一种独特的力量,并且比Psyco,Numba和PyPy(因为它)具有更大的潜力。它是一个成熟的选择,没有死路。