PyPy: 这是什么话题?

42 投票
5 回答
7424 浏览
提问于 2025-04-15 23:32

注意:这个标题故意引人注意(让你想点击并投票关闭这个问题),我并不想显得很忙。

我最近越来越多地听到关于PyPy的讨论。它就像一条线性图。

  • 那么,PyPy到底有什么特别之处呢?据我所知,用动态语言自己写的实现并不是什么稀罕事,难道我没理解到什么吗?

  • 有些人甚至称PyPy是“未来”的[python],或者认为这个实现有某种深刻的潜力。这到底是什么意思呢?

5 个回答

11

PyPy的一个很酷的地方是,除了它运行得快,而且是用RPython(Python语言的一个子集)写的,基本上是自我启动的。它还可以为你用PyPy写的任何程序提供一个自动生成的JIT(即时编译器)。这意味着你可以快速实现自己的编程语言,而且运行速度相当快。

想了解更多,可以点击这里

22

我们可以这样来看这个问题……

假设你想自己做一个动态语言,并且希望它运行得快。

你有两种选择:一种是比较难的方式,另一种是用pypy。

难的方式就是用C语言写一个解释器,然后再手动用C语言实现一个即时编译器(jit)。这个过程需要用到很多复杂的技术,比如方法即时编译、线程即时编译、跟踪即时编译、多态内联缓存、循环不变移动等等……你可能需要花好几年时间来调试,如果你能坚持下去,不放弃,最终可能会得到一个运行很快的动态语言实现。

而另一种方式就是使用pypy框架。

这意味着你可以用Python来写你的解释器,而不是用C(实际上,你会用rpython,这是一种更简单的Python子集,可以编译成C)。

一旦你写好了解释器,pypy会自动为你生成一个即时编译器,完全免费。

这样一来,你基本上就完成了。

听起来不错吧?

47

在谈论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的一个替代方案是unladen swallow(一个谷歌项目),它旨在通过使用LLVM的JIT能力来加速CPython的实现,但由于开发者需要处理LLVM中的错误,unladen swallow的进展变得缓慢。

总的来说,我认为PyPy被视为Python的未来,因为它将语言规范与虚拟机实现分开。比如,在stackless Python中引入的特性,可以在PyPy中以很小的额外努力实现,因为这只是改变语言规范,而共享的代码保持不变。代码更少,错误更少,合并更少,工作量更小。

而且,比如说,如果你用RPython编写一个新的bash shell实现,你可以免费获得一个JIT编译器,从而加速许多Linux shell脚本,而不需要学习任何复杂的JIT知识。

撰写回答