64位机器上psyco的替代方案

7 投票
2 回答
4389 浏览
提问于 2025-04-16 13:51

Psyco 是个很厉害的工具,在它能正常工作的情况下。不过,除非我们换成32位的Python版本,否则看起来64位的版本短期内是没希望了 。有没有什么其他的工具可以加速那些对CPU要求高的普通Python代码呢?

相关内容

Psyco x64?

把Psyco移植到64位可能会遇到什么问题?

2 个回答

3

PyPy,是Psyco开发者提到的一个工具,但它并不是一个简单的替代品,不能仅仅因为想在某些慢代码上提高速度就用它。它是一个完全不同的生态系统。

使用PyPy会带来很多影响,也会引发许多兼容性问题,尤其是对于大型项目来说,这个决定是非常重要的:这意味着你要切换到一个完全不同的Python实现,远离Python主要开发者的质量保证水平。大多数情况下,PyPy的速度提升被过分宣传了。初次执行时速度很慢,内存占用也很大,表现得很糟糕。提供的基准测试数据往往是“经过挑选”的。而且,项目中总是需要某些库,或者会遇到图形界面、服务器、IDE或调试问题,这些都会严重影响进度,增加开发和调试的时间。速度提升很难预测,也很难通过专注来调整,使用起来让人感觉不太舒服。

现在在CPython中加速瓶颈代码的成熟替代方案是CythonNumba。(还有其他一些“短命的”选择在这里


Numba是一个针对CPython的即时编译库(就像Psyco一样),主要关注数值代码。只需在瓶颈函数上加上一个jit装饰器,就能带来惊人的速度提升(10到200倍,比Psyco和PyPy都快)。而且它在与numpy数组结合使用时特别迅速!(与Psyco不同);不过到目前为止,Numba对其他普通Python代码没有帮助,甚至会大幅减慢速度,尤其是那些主要处理对象属性、字符串、普通列表、字典等的代码。(最糟糕的情况是速度只有0.04倍,比Psyco还慢)。与Psyco不同,Numba的安装包很大,导入速度也慢(因为要引入numpy)。但它可以让你从选定的函数中创建预编译的静态模块,这样在部署时就不再需要Numba的安装(类似于Cython)。


Cython是一种将Python和C混合的静态编译语言(是Python语言的超集),它使用C编译器的流程,生成DLL模块,通常通过将一些瓶颈函数重构到一个单独的模块来使用。即使是未改变的较大Python模块经过Cython编译,也通常能带来大约2倍的速度提升,几乎是“白得”的!不过,这些编译后的DLL模块比.pyc/.pyo文件要大得多。Cython可以说是将Python字节码展开为直接的C函数调用,并对常量等进行一些小的优化。(例如,Wheezy.web的pip安装默认会毫不客气地将其所有代码进行Cython化,这在开发过程中会让调试和检查变得困难)

除了未改变代码的“免费”速度提升外,通过在热点Python代码中添加一些Cython静态类型声明,还可以相对简单地获得更大的速度提升(接近C语言的速度),特别是对于数值/数组代码和一些面向对象的工作。C语言的字符串处理需要更复杂的编码。

Cython允许通过关注瓶颈并以细致的方式无缝调整代码,持续提高速度,直到接近C语言的速度。这是它独特的优势,潜力远超Psyco、Numba和PyPy。这是一个成熟的选择,没有死胡同。

5

答案是使用 PyPy。在 http://psyco.sourceforge.net/introduction.html 上提到:

我在2006年的计划是把Psyco中的技术移植到PyPy上。

在一篇PyPy的 博客文章中,提到了一些重点和PyPy的状态:

...PyPy的亮点和状态:
* 大多数Python的基准测试运行速度比CPython或Psyco快很多
* 实际的PyPy编译工具链(200 KLocs)运行速度是之前的两倍
* 支持x86的32位和64位,并正在支持ARM
...

撰写回答