10.6 PyPy

PyPy(http://pypy.org/)是符合标准的Python语言的一个高效实现。实际上,现在最权威的Python实现CPython(这么叫是因为它是用C语言写的)有可能非常慢。PyPy的目的是要用Python写一个Python解释器。随着时间的推移,现在在用RPython编写,RPython是Python语言的一个限制性子集。

RPython对Python语言的限制的主要方式是,要求变量类型能够在编译时推断。RPython的代码会被翻译成C代码从而构建解释器,当然RPython也可以用来实现其他语言而不只是Python。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

除了技术上的挑战,PyPy吸引人的地方在于目前它是CPython的更快的替代品。PyPy包含内置的JIT(Just-In-Time)编译器。简单来说,就是通过利用解释的灵活性对编译后的代码的速度进行整合从而运行得更快。

到底多快呢?看情况,但对于纯算法代码会更快一点。对于普通的代码,大多数情况下PyPy声称可以达到3倍的速度。尽管如此,也不要期望太高,PyPy同样有一些CPython的局限性,如可恶的GIL(Global Interpreter Lock,全局解释器锁)。

尽管PyPy并非一种严格意义上的优化技术,但是将其作为一种支持的Python实现还是不错的。达到这一目标只需要与支持的其他Python版本保持同样的编码策略,基本上,只需要保证像在CPython上一样在PyPy上测试你的软件。tox(参见6.7节)支持使用PyPy构造虚拟环境,就像CPython 2和CPython 3一样,所以实现起来还是相当简单的。

如果想让你的软件运行在PyPy上,最好是在项目的初期就开始,以避免在后期支持时可能带来的大量工作。

 注意

Hy项目从项目初期就成功地采用了这一策略。Hy一直支持PyPy和其他所有Python版本,且没有任何问题。但是,我们却没能在所有OpenStack项目中这样做,我们正在被一些由于各种原因不能在PyPy上运行的代码路径和依赖所阻碍,因为它们没有在项目的早期进行充分地测试。

PyPy与Python 2.7兼容,并且它的JIT编译器可以运行在32位和64位x86和ARM体系结构上,并且可以运行在不同的操作系统上(Linux、Windows、Mac OS X等)。其对Python 3的支持正在开发中。