我越来越多地阅读和听到关于PyPy的内容。 它就像一条线性图形。
- 为什么PyPy如此特殊? 据我所知,用语言本身编写动态语言的实现并不是什么罕见的事情,或者我没有理解某些东西吗? - 有些人甚至称PyPy为“未来”[of python],或者看到这种实现的某种深层潜力。 这究竟是什么意思?
提到PyPy项目时需要注意,它的目标是提供两个实现:第一个是JIT编译器生成器。是的,生成器指的是他们正在实现一个用于编写高度动态编程语言(例如Python)实现的框架。第二个是对这个框架进行实际测试的PyPy Python解释器实现。
现在,有多种回答可以解释为什么PyPy如此特别:该项目始于2004年,作为研究项目而非公司开发项目;重新实现了Python并使用Python实现了JIT编译器,并可以将带有一些限制的RPython(可以被该框架转换为编译二进制文件的Python代码)转换为编译后的二进制文件。
当前版本的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的实现,但是由于开发者需要处理LLVM中的错误,unladden swallow的进展放缓。
总之,我认为PyPy被视为Python的未来,因为它将语言规范与虚拟机实现分离。例如,在stackless Python中引入的特性可以很容易地在PyPy中实现,并且只需要稍微修改语言规范就可以了,因为共享代码保持不变。减少代码量、减少BUG、减少合并工作、减少工作量。
通过使用RPython编写一个新的bash shell实现,您可以免费获得JIT编译器,并加速许多Linux shell脚本,而无需学习任何繁重的JIT知识。
PyPy有一个很棒的特性(除了快速和使用RPython编写(一种Python语言的子集),因此基本上是自举的),就是它可以为您在PyPy中编写的任何程序提供自动生成的JIT(即时编译器):这使得它非常适合快速实现您自己的语言并使其运行相当快。
在此处阅读更多信息。
大多数人都认为编写Python比C更容易,因此用Python(严格来说是RPython)编写的Python解释器应该比CPython更容易修改且出现的错误更少。