注意:标题是故意挑衅的(让你点击它并想要对问题进行近距离投票),我不想看起来全神贯注。
我一直在阅读和听到越来越多的有关PyPy的信息。它就像一个线性图。
为什么 PyPy 如此特别?据我所知,用语言本身编写的动态语言的实现并不罕见,或者我没有得到什么?
有些人甚至将 PyPy 称为 [python] 的“未来”,或者在这个实现中看到了某种深层次的潜力。这究竟是什么意思?
谈论 PyPy 项目时要注意的一件好事是,它实际上旨在提供两个可交付成果:首先是JIT 编译器生成器。是的,生成器,这意味着他们正在实现一个框架,用于编写高度动态的编程语言(例如 Python)的实现。第二个是对这个框架的实际测试,是PyPy Python 解释器实现。
现在,为什么 PyPy 如此特别有多个答案:项目开发从 2004 年开始,从研究项目开始而不是从公司开始,在 Python 中重新实现 Python,在 Python 中实现 JIT 编译器,并且可以翻译 RPython(Python 代码框架有一些限制,以便能够将该代码转换为 C) 编译的二进制文件。
当前版本的 PyPy与 CPython 2.5 版本 99% 兼容,并且可以运行 Django、Twisted 和许多其他 Python 程序。过去存在无法运行现有 CPython C 扩展的限制,但 PyPy 中的 cpyext 模块也解决了这个问题。C API 兼容性是可能的,并且在某种程度上已经实现。JIT 也很真实,看这个 pystone 比较。
使用 CPython:
Python 2.5.5 (r255:77872, Apr 21 2010, 08:44:16)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from test import pystone
>>> pystone.main(1000000)
Pystone(1.1) time for 1000000 passes = 12.28
This machine benchmarks at 81433.2 pystones/second
使用 PyPy:
Python 2.5.2 (75632, Jun 28 2010, 14:03:25)
[PyPy 1.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``A radioactive cat has 18
half-lives.''
>>>> from test import pystone
>>>> pystone.main(1000000)
Pystone(1.1) time for 1000000 passes = 1.50009
This machine benchmarks at 666625 pystones/second
因此,只需在某些计算上使用 PyPy,您就可以获得近10 倍的加速!
因此,随着 PyPy 项目逐渐成熟并提供一些优势,它吸引了试图解决代码中速度问题的人们的更多兴趣。PyPy 的替代方案是 unladden Swallow(一个 Google 项目),旨在通过使用 LLVM 的 JIT 功能来加速 CPython 的实现,但 unladden Swallow 的进展缓慢,因为开发人员需要处理 LLVM 中的错误。
所以,总而言之,我猜 PyPy 被认为是 Python 的未来,因为它将语言规范与 VM 实现分离。中引入的功能,例如。stackless Python,然后可以在 PyPy 中实现,只需要很少的额外努力,因为它只是改变语言规范并且您保持共享代码相同。更少的代码,更少的错误,更少的合并,更少的努力。
例如,通过在 RPython 中编写一个新的 bash shell 实现,您可以免费获得一个 JIT 编译器并加速许多 linux shell 脚本,而无需实际学习任何重要的 JIT 知识。
让我们这样看...假设您想实现自己的动态语言,并且想让它变得更快。你有两个选择:hard way 和 pypy。
困难的方法是用 c 编写解释器,然后在 c 中手动实现 jit,方法是使用非常复杂的技术,例如方法 jit、线程 jit、跟踪 jit、多态内联缓存、循环不变运动等等等等……花了几年的时间来调整它,如果你坚持不懈并且不放弃,你最终可能会得到一个快速的动态语言实现。
或者,您可以使用 pypy 框架。这意味着,用 python 而不是 c 编写你的解释器(实际上,它将是 rpython,一个可以编译为 c 的更有限的 python 子集)。一旦你编写了解释器,pypy 会自动免费生成一个 jit。你基本上完成了。
听起来不错吧?
PyPy 的一个很酷的地方(除了速度快并且用 RPython(Python 语言的一个子集)编写,基本上是自举的,它可以为你用 PyPy 编写的任何程序提供一个自动创建的 JIT (即时编译器):这个使其成为快速实现您自己的语言并使其相当快的理想选择。
在这里阅读更多
更不用说他们最近在一些基准测试中超过了 CPython 的速度。看看他们的博客,我想。我无法从这里到达它:
由于我们大多数人都同意编写 Python 比 C 更容易,因此用 Python(嗯,技术上是 RPython)编写的 Python 解释器应该能够比 CPython 更容易修改并且错误更少。