猛踩油门!令Python加速( 二 )


PyPy则是一个更为宏大的项目:它用Python语言重新将Python实现了一遍 。当然 , 这本身不会直接加快运行速度 , 这么做主要是为便于代码的分析、优化与翻译 。正是基于这个框架 , JIT编译才变为了可能(这使得我们不再需要Psyco , 代码在PyPy内就能完成编译) 。甚至PyPy还能将代码翻译成像C那样的、性能更高的编程语言 。另外 , 在PyPy中所实现的Python的核心子集被称为RPython(restricted Python) , 这部分已经有工具可以静态地编译成高效的机器码 。
在某种程度上 , Unladen Swallow也是一种Python的JIT编译器 。或者更精确地说 , 它是Python解释器的一个版本 , 被称为底层虚拟机(Low Level Virtual machine , LLVM) 。该项目的目标是将加速因子相对标准编译器提高至5 。然而 , Unladen Swallow项目还没有达到这个目标 , 但它的开发活动似乎已经停止了 。
Pyston也是一个由Dropbox开发的、与LLVM平台较为接近的Python JIT编译器 。在本书写作期间 , Pyston还是一个非常年轻的项目 , 只支持了语言的一个子集 , 并且完全不支持Python 3 。然而在很多情况下 , 它已经优于Python的标准实现 , 并且目前还在积极地开发中 。此外 , Parakeet也是一个相当年轻的项目 , 用该项目Web页面的话说 , “其中包含了类型接口、并行数据的数组操作以及大量能使代码加速的黑魔法” 。
GPULib、PyStream、PyCUDA与PyOpenCL:这四个包都是在用图像处理单元(graphics processing units , GPUs)来实现代码的加速 。它们与Psyco这样的JIT编译器不一样 , 后者是通过代码优化来实现加速的 。但如果我们有一个强大的GPU的话 , 为什么不用它来进行计算呢?比起GPULib , PyStream更加古老一点 , 而Tech-X公司已经转向了更为年轻的GPULib项目的开发 。它提供了基于GPU的各种形式的数值计算 。另外 , 如果您想用GPU来加速自己的代码 , PyCUDA、PyOpenCL这两个项目也值得您试试看 。
【猛踩油门!令Python加速】Pyrex、Cython、Numba与Shedskin:这四个项目都致力于将Python代码翻译为C、C++及LLVM代码 。其中 , Shedskin会将Python代码编译为C++程序 , 而Pyrex和Cython(后者实际上是前者的一个分支)的编译目标主要是C语言 。另外 , 当我们用Cython(及其前身Pyrex)来进行编译时 , 我们可以在代码中加入一些可选的类型声明 , 例如静态声明一个整型变量之类的 。此外 , Cython还有NumPy数组的额外支持 , 这使您可以写出某种针对底层逻辑的代码 , 以高效操作数组内容 。我在自己的代码中使用了这个特性 , 其中的部分代码的加速因子提升到300至400 。而且 , 由Pyrex和Cython生成的代码可以直接编译为Python扩展模块 , 然后在Python代码中导入即可 。如果您想从Python程序中生成出通用的C代码 , Cython也依然是一种安全的选择 。而如果您只是在寻找一种加速方式 , 特别是在面向数组与数学计算的代码的时候 , 或许Numba是一个值得看看的选择 。它在被导入时会自动生成相应的LLVM代码 。其升级版本NumbaPro还提供一些更为高级的功能 , 甚至还包含了对GPU的支持 。
SWIG、F2PY与Boost.Python:这些工具可以帮助您将其他语言封装为Python的模块 。它们所封装的语言分别是:C/C++ , Fortran , C++ 。尽管我们也可以自行编写访问扩展模块的代码 , 但使用这些工具可以帮助我们免于许多单调乏味的工作——而且它们也更能确保结果的正确性 。以SWIG为例 , 您只需要启动一个命令行工具 , 往里输入C(或C++)的头文件 , 封装器代码就自动生成了 。SWIG的另一个优点在于 , 除了Python , 它还可以成为很多语言的生成封装器 。例如 , 您同样也能轻易地利用JAVA或php这样的语言来编写相关的扩展 。
ctypes、llvm-py与CorePy2:这些模块可以帮助我们实现对Python底层对象的操纵 。ctypes模块可用于在内存中构建编译C的对象 , 并且调用某些共享库中(如某些DLL)的C函数 。而llvm-py包则正如之前所说 , 主要提供了LLVM的Python接口 , 以便于我们可以构建代码 , 然后更高效地编译它们 。甚至如果您愿意的话 , 也可以在Python中用它来构建您自己的编译器(没准能搞出一种属于自己的编程语言!) 。CorePy2也一样 , 它可以帮助您处理与高效运行代码对象 , 只不过 , 它是运行在汇编层的 。(值得注意的是 , ctypes如今已是Python标准库的一部分了 。)


推荐阅读