PyPy:为什么如此受关注?

42
注意:标题是故意挑衅的(为了让你点击它并想关闭问题),我不想显得很担心。
我越来越多地阅读和听到关于PyPy的内容。 它就像一条线性图形。
- 为什么PyPy如此特殊? 据我所知,用语言本身编写动态语言的实现并不是什么罕见的事情,或者我没有理解某些东西吗? - 有些人甚至称PyPy为“未来”[of python],或者看到这种实现的某种深层潜力。 这究竟是什么意思?

6
"Preoccupied"是指被某件事或思想所牵扯、占据了大部分的注意力和精力。 - fmark
实际上,这个词是“provocating”,我相信这是马来西亚英语中的“provocative”。 - martineau
23
我必须承认我有些困惑。 - David Heffernan
预先影响、占据(思维);被预先占据;提前会面;预先防止,抢先。 - FUD
这应该会让一切变得清晰明了:http://morepypy.blogspot.co.uk/2011/04/tutorial-writing-interpreter-with-pypy.html - Erik Kaplun
当一个话题被关闭但仍然收到很多赞同票时,所有协助关闭它的版主都应该因每个赞成票而受到负分。 - user1767754
5个回答

47

提到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知识。


13
让我来理解一下。一个用Python编写的解释器,在另一个用C等语言编写的Python解释器上运行,可以比它自己运行时更快地执行其他Python程序?如果是这样,似乎你可以再多几个级别这样做,并拥有一个难以置信快速的东西... - martineau
13
在CPython上运行PyPy Python解释器并不快。只有在使用另一个Python解释器引导它以便能够自行运行时,它才会变得快速。因此,向堆栈中添加更多解释器并不会使任何东西变得更快,抱歉 :)。 - Jean-Paul Calderone
4
澄清一下:PyPy解释器是一个可执行文件。它是用RPython编写的,但是这个RPython是由PyPy翻译器编译的。当您编译PyPy解释器时,实际上会引导它(因为您可能会使用CPython来运行编译解释器的翻译器),但是一旦解释器被编译,它就是独立的。因此,仅因为它是用Python编写的,并不意味着它必须在Python解释器上运行。 - John Thompson
@martineau - 是的,就像电影《盗梦空间》但是反过来。一只蟒蛇包含了另一只蟒蛇,再包含了另一只蟒蛇,详见此处的仔细记录 http://mythologian.net/ouroboros-symbol-of-infinity 。 - Robino

22
让我们这样看待它... 假设你想要实现自己的动态语言,并且希望让它运行快速。你有两个选择:艰辛的方式和pypy。
艰辛的方式意味着用c编写你的解释器,然后手动实现jit(即时编译器),同样使用各种复杂的技术,如方法-jit、线程-jit、跟踪jit、多态内联缓存、循环不变式移动等等...需要花费几年的时间来调优,如果你坚持不懈并且不放弃,最终可能会获得一个快速的动态语言实现。
或者,你可以使用pypy框架。也就是说,用Python而不是C编写你的解释器(实际上,它将是rpython,一种更为受限制的Python子集,可编译成C)。一旦你编写了你的解释器,pypy会自动生成一个免费的jit。然后你基本上就完成了。
听起来很好,对吧?

假设您想要实现自己的动态语言,并且希望它运行速度快。您有两个选择:走弯路或使用pypy。+1 - IronManMark20

11

PyPy有一个很棒的特性(除了快速和使用RPython编写(一种Python语言的子集),因此基本上是自举的),就是它可以为您在PyPy中编写的任何程序提供自动生成的JIT(即时编译器):这使得它非常适合快速实现您自己的语言并使其运行相当快。

此处阅读更多信息。


5
不用说,他们最近在一些基准测试中甚至超过了CPython的速度。可以看看他们的博客,我想是这样的。我从这里无法访问:http://morepypy.blogspot.com/

4

大多数人都认为编写Python比C更容易,因此用Python(严格来说是RPython)编写的Python解释器应该比CPython更容易修改且出现的错误更少。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接