最重要的 Python 实现是用 C 语言编写的,叫作 CPython。大多数人在讨论 Python 时

指的都是 CPython。随着语言的进化,C 语言实现也相应发生变化。除了 C 之外,Python还有其他几种实现方式,这些实现方式都在努力地跟上主流。大多数实现方式的时间表都

要落后于 CPython,但它们提供了一个好机会,可以在具体环境中使用并推广 Python 语言。

为什么要关注 Python 实现

Python 实现有许多种。在 Python 官网上关于这一话题的维基百科页面中,主要介绍了 20

多种语言变体、方言或除 C 语言之外的 Python 解释器实现。其中一些只是实现了语言核心

语法、功能和内置扩展的一个子集,但至少有几个与 CPython 几乎完全兼容。最重要的是,

虽然其中一些只是玩具项目或实验,但大部分都是为了解决某些实际问题而创建的,这些

问题要么是用 CPython 无法解决,要么需要开发人员花费巨大的精力。这些问题的实例包

括如下几个。

• 在嵌入式系统中运行 Python 代码。

• 与运行框架(如 Java 或.NET)或其他语言做代码集成。

• 在 Web 浏览器中运行 Python 代码。

本节将简要介绍目前 Python 开发人员可用的最流行和最新的 Python 实现。

Stackless Python

Stackless Python 自称 Python 增强版。之所以名为 Stackless(无栈),是因为它没有依赖

C 语言的调用栈。它实际上是修改过的 CPython 代码,还添加了一些新的功能,在创建 Stackless

Python 时 Python 核心实现中还没有这些功能。其中最重要的功能就是由解释器管理的微线

程,用来替代依赖系统内核上下文切换和任务调度的普通线程,既轻量化又节约资源。

Stackless Python 最新可用的版本是 2.7.9 和 3.3.5,分别实现的是 Python 2.7 和 3.3。在

Stackless Python 中,所有的额外功能都是内置 stackless 模块内的框架。

Stackless Python 并不是最有名的 Python 实现,但很值得一提,因为它引入的思想对编

程语言社区有很大的影响。将 Stackless Python 中的内核切换功能提取出来并作为一个独立

包发布,名为 greenlet,现在是许多有用的库和框架的基础。此外,它的大部分功能都

在 PyPy 中重新实现,PyPy 是另一个 Python 实现,我们将稍后介绍。

Jython

Jython 是 Python 语言的 Java 实现。它将代码编译为 Java 字节代码,开发人员在 Python

模块中可以无缝使用 Java 类。Jython 允许人们在复杂应用系统(例如 J2EE)中使用 Python

作为顶层脚本语言,它还将 Java 应用引入到 Python 世界中。Jython 的一个很好的例子就是,

在 Python 程序中可以使用 Apache Jackrabbit(这是一个基于 JCR 的文档仓库 API。

Jython 最新可用的版本是 Jython 2.7,对应的是 Python 2.7 版。它宣称几乎实现了 Python

所有的核心标准库,并使用相同的回归测试套件。Jython 3.x 版正在开发中。

Jython 与 CPython 实现的主要区别如下所示。

• 真正的 Java 垃圾回收,而不是引用计数。

• 没有全局解释器锁(Global Interpreter Lock,GIL),在多线程应用中可以充分利用

多个内核。

这一语言实现的主要缺点是缺少对 C/Python 扩展 API 的支持,因此用 C 语言编写的

Python 扩展在 Jython 中无法运行。这种情况未来可能会发生改变,因为 Jython 3.x 计划支

持 C/Python 扩展 API。

某些 Python Web 框架(例如 Pylons)被认为是促进 Jython 的开发,使其可用于 Java 世界。

IronPython

IronPython 将 Python 引入.NET 框架中。这个项目受到微软的支持,IronPython 的主要

开发人员都在微软工作。它是推广语言的一种重要实现。除了 Java,.NET 社区是最大的开

发者社区之一。还值得注意的是,微软提供了一套免费开发工具,可以将 Visual Studio 转

换为成熟的 Python IDE。这是作为 Visual Studio 的插件发布的,名为 PTVS(Python Tools for

Visual Studio,用于 Visual Studio 的 Python 工具),在 GitHub 可以找到其开源代码。

最新的稳定版本是 2.7.5,与 Python 2.7 兼容。与 Jython 类似,Python 3.x 的实现也在

开发中,但还没有可用的稳定版本。虽然.NET 主要在微软 Windows 系统上运行,但是

IronPython 也可以在 Mac OS X 和 Linux 系统上运行。这一点要感谢 Mono,一个跨平台的

开源.NET 实现。

与 CPython 相比,IronPython 的主要区别或优点如下。

• 与 Jython 类似,没有全局解释器锁(Global Interpreter Lock,GIL),在多线程应用

中可以充分利用多个内核。

• 用 C#和其他.NET 语言编写的代码可以轻松集成到 IronPython 中,反之亦然。

• 通过 Silverlight,在所有主流 Web 浏览器中都可以运行。

说到弱点,IronPython 也与 Jython 非常类似,因为它也不支持 C/Python 扩展 API。对

于想要使用主要基于 C 扩展的 Python 包(例如 NumPy)的开发人员来说,这一点是很重

要的。有一个叫作 ironclad 的项目,其目的是在 IronPython 中无缝使用这些扩展,虽然它

最新支持的版本是 2.6,开发似乎也停止了。

PyPy

PyPy 可能是最令人兴奋的 Python 实现,因为其目标就是将 Python 重写为 Python。在

PyPy 中,Python 解释器本身是用 Python 编写的。在 Python 的 CPython 实现中,有一个 C代码层来实现具体细节。但在 PyPy 实现中,这个 C 代码层用 Python 完全重写。

这样你可以在代码运行期间改变解释器的行为,并实现 CPython 难以实现的代码

模式。

目前 PyPy 的目的是与 Python 2.7 完全兼容,而 PyPy3 则与 Python 3.2.5 版兼容。

以前对 PyPy 感兴趣主要是理论上的原因,只有喜欢深入钻研语言细节的人才会对它感

兴趣。它通常不用于生产环境,但这些年来这种状况已经发生改变。现在许多基准测试给

出惊人的结果,PyPy 通常比 CPython 实现要快得多。这个项目有自己的基准测试网站,记

录了用数十种不同的基准测试对每一版本性能的测量结果(参见 http://speed.pypy.org/)。网

站清晰地显示,启用 JIT 的 PyPy 至少比 CPython 要快好几倍。由于 PyPy 的这一特性以及

其他特性,使得越来越多的开发人员决定在生产环境中切换到 PyPy。

PyPy 与 CPython 实现的主要区别在于以下几个方面。

• 使用垃圾回收,而不是引用计数。

• 集成跟踪 JIT 编译器,可以显著提高性能。

• 借鉴了 Stackless Python 在应用层的无栈特性。

与几乎所有其他的 Python 实现类似,PyPy 也缺乏对 C/Python 扩展 API 的完全官方支

持。但它至少通过 CPyExt 子系统为 C 扩展提供了某种程度的支持,虽然文档不完整,功

能也尚未完善。此外,社区正在努力将 NumPy 迁移到 PyPy 中,因为这是最需要的功能。