我听说了很多关于PyPy项目的事情。他们声称它比他们网站上的CPython解释器快6.3倍。

每当我们谈论像Python这样的动态语言时,速度是首要问题之一。为了解决这个问题,他们说PyPy要快6.3倍。

第二个问题是并行性,即臭名昭著的全局解释器锁(GIL)。为此,PyPy说它可以提供无gil的Python。

如果PyPy可以解决这些巨大的挑战,那么它的弱点是什么?也就是说,是什么阻止了像我这样的典型的Python开发人员现在转向PyPy ?


当前回答

该网站并没有声称PyPy比CPython快6.3倍。引用:

所有基准测试的几何平均值比CPython快0.16或6.3倍

这是一个与您所做的概括性陈述非常不同的陈述,当您理解其中的区别时,您将至少理解为什么不能只说“使用PyPy”的一组原因。这听起来像是我在挑刺,但理解为什么这两种说法完全不同是至关重要的。

具体来说:

他们的陈述只适用于他们使用过的基准测试。它完全没有说明您的程序(除非您的程序与他们的一个基准测试完全相同)。 这个陈述是关于一组基准的平均值。即使是他们测试过的程序,也没有人声称运行PyPy会带来6.3倍的改进。 没有人声称PyPy能运行CPython运行的所有程序,更不用说更快了。

其他回答

第二个问题比较容易回答:如果所有代码都是纯Python,那么基本上可以使用PyPy作为替代。然而,许多广泛使用的库(包括一些标准库)是用C编写的,并编译为Python扩展。其中一些可以与PyPy一起工作,一些不能。PyPy提供了与Python相同的“面向”工具——也就是说,它是Python——但其内部结构不同,因此与这些内部结构交互的工具将无法工作。

至于第一个问题,我想这有点像第一个问题:PyPy一直在快速发展,以提高速度并增强与其他代码的互操作性。这使得它更像是实验性的,而不是官方的。

我认为,如果PyPy进入稳定状态,它可能会开始得到更广泛的应用。我还认为对Python来说,摆脱C语言的基础是一件很棒的事情。但这在一段时间内不会发生。PyPy还没有达到临界质量,它本身几乎足够有用,可以做你想做的所有事情,这将激励人们填补空白。

I did a small benchmark on this topic. While many of the other posters have made good points about compatibility, my experience has been that PyPy isn't that much faster for just moving around bits. For many uses of Python, it really only exists to translate bits between two or more services. For example, not many web applications are performing CPU intensive analysis of datasets. Instead, they take some bytes from a client, store them in some sort of database, and later return them to other clients. Sometimes the format of the data is changed.

BDFL和CPython开发人员是一群非常聪明的人,他们设法帮助CPython在这种情况下表现出色。这是一个无耻的博客:http://www.hydrogen18.com/blog/unpickling-buffers.html。我使用的是Stackless,它源自CPython,并保留了完整的C模块接口。在这种情况下,我没有发现使用PyPy的任何优势。

因为pypy不是100%兼容,需要8g的ram来编译,是一个移动的目标,并且是高度实验性的,其中cpython是稳定的,20年来模块构建器的默认目标(包括不能在pypy上工作的c扩展),并且已经广泛部署。

Pypy可能永远不会成为参考实现,但它是一个很好的工具。

对于许多项目,不同的python之间在速度方面实际上是0%的差异。这是由工程时间主导的,所有的python都有相同数量的库支持。

简单来说:PyPy提供了CPython所缺乏的速度,但牺牲了它的兼容性。然而,大多数人选择Python是因为它的灵活性和“包含电池的”特性(高兼容性),而不是因为它的速度(尽管它仍然是首选)。