我听说了很多关于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运行的所有程序,更不用说更快了。

其他回答

我发现了一些例子,其中PyPy比Python慢。 但是:只在Windows上。

C:\Users\User>python -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 294 msec per loop

C:\Users\User>pypy -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 1.33 sec per loop

所以,如果你想到PyPy,忘了Windows吧。 在Linux上,你可以实现惊人的加速。 示例(列出1到1,000,000之间的所有质数):

from sympy import sieve
primes = list(sieve.primerange(1, 10**6))

这在PyPy上比在Python上快10(!)倍。 但不是在窗户上。那里的速度只有原来的3倍。

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

支持的Python版本

引用Python的禅意:

可读性。

例如,Python 3.8引入了fstring =。

Python 3.8+中可能有其他对您更重要的特性。PyPy目前不支持Python 3.8+。

无耻的自我广告:Python版本的杀手特性-如果你想知道更多你使用旧Python版本时错过的东西

问:如果与CPython相比,PyPy可以解决这些巨大的挑战(速度、内存消耗、并行性),那么它的弱点是什么?

答:首先,几乎没有证据表明PyPy团队可以解决一般的速度问题。长期的证据表明,PyPy运行某些Python代码比CPython慢,这个缺点似乎深深植根于PyPy。

其次,在相当大的一组情况下,当前版本的PyPy比CPython消耗更多的内存。所以PyPy还没有解决内存消耗的问题。

PyPy是否解决了上面提到的巨大挑战,并且通常会比CPython更快,更少的内存消耗,对并行更友好,这是一个悬而未决的问题,短期内无法解决。有些人打赌,PyPy将永远无法提供一个通用的解决方案,使其在所有情况下都能主导CPython 2.7和3.3。

如果PyPy在总体上比CPython更好,这是值得怀疑的,影响其更广泛采用的主要弱点将是它与CPython的兼容性。还有一些问题,比如CPython在更广泛的cpu和操作系统上运行,但与PyPy的性能和CPython兼容性目标相比,这些问题要重要得多。


问:为什么我现在不能用PyPy替换CPython ?

答:PyPy并不是100%与CPython兼容,因为它没有在底层模拟CPython。一些程序可能仍然依赖于CPython的独特特性,而这些特性在PyPy中是不存在的,比如C绑定、Python对象和方法的C实现,或者CPython垃圾收集器的增量特性。

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

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