“PyPy 是 Python 中 Python 的重新实现”是描述 PyPy 的一种相当误导的方式,恕我直言,尽管它在技术上是正确的。
PyPy 有两个主要部分。
- 翻译框架
- 口译员
翻译框架是一个编译器。它将RPython代码编译为 C(或其他目标),自动添加垃圾收集和 JIT 编译器等方面。它不能处理任意 Python 代码,只能处理 RPython。
RPython 是普通 Python 的子集;所有 RPython 代码都是 Python 代码,但不是相反。RPython 没有正式的定义,因为 RPython 基本上只是“可以被 PyPy 的翻译框架翻译的 Python 的子集”。但是为了被翻译,RPython 代码必须是静态类型的(类型是推断出来的,你不需要声明它们,但它仍然是每个变量严格的一种类型),你不能做诸如声明/修改函数之类的事情/运行时的类。
解释器是一个用 RPython 编写的普通 Python 解释器。
因为 RPython 代码是普通的 Python 代码,所以您可以在任何 Python 解释器上运行它。但是 PyPy 的速度声明都不是来自于以这种方式运行。这只是为了快速测试周期,因为翻译解释器需要很长时间。
了解了这一点后,关于 PyPyPy 或 PyPyPyPy 的猜测实际上没有任何意义。你有一个用 RPython 编写的解释器。你把它翻译成可以快速执行 Python 的 C 代码。过程在那里停止;没有更多的 RPython 可以通过再次处理来加速它。
所以“PyPy 怎么可能比 CPython 更快”也变得相当明显。PyPy 有一个更好的实现,包括一个 JIT 编译器(我相信,如果没有 JIT 编译器,它通常不会那么快,这意味着 PyPy 只对易受 JIT 编译影响的程序更快)。CPython 从未被设计为 Python 语言的高度优化实现(尽管他们确实试图使其成为高度优化的实现,如果你遵循不同之处的话)。
PyPy 项目的真正创新之处在于他们不用手工编写复杂的 GC 方案或 JIT 编译器。他们在 RPython 中相对简单地编写解释器,并且对于所有 RPython 比 Python 低级,它仍然是一种面向对象的垃圾收集语言,比 C 高级得多。然后翻译框架会自动添加诸如 GC 和 JIT 之类的东西。所以翻译框架是一个巨大的努力,但它同样适用于 PyPy python 解释器,但是它们改变了它们的实现,允许更多的实验自由来提高性能(不用担心引入 GC 错误或更新 JIT 编译器以应对这些变化)。这也意味着当他们开始实现 Python3 解释器时,它会自动获得相同的好处。以及使用 PyPy 框架编写的任何其他解释器(其中有许多处于不同的抛光阶段)。并且所有使用 PyPy 框架的解释器都会自动支持框架支持的所有平台。
因此,PyPy 项目的真正好处是(尽可能地)分离出为动态语言实现高效的平台无关解释器的所有部分。然后在一个地方提出一个很好的实现,可以在许多解释器中重复使用。这不是像“我的 Python 程序现在运行得更快”那样的立竿见影的胜利,但它对未来是一个很好的前景。
它可以更快地运行你的 Python 程序(也许)。