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

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

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

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


当前回答

PyPy已经有Python 3支持一段时间了,但根据Anthony Shaw 2018年4月2日在HackerNoon发布的这篇文章,PyPy3仍然比PyPy (Python 2)慢几倍。

对于许多科学计算,特别是矩阵计算,numpy是更好的选择(参见常见问题:应该安装numpy还是numpypy?)

Pypy不支持gmpy2。您可以使用gmpy_cffi,不过我还没有测试它的速度,该项目在2014年发布了一个版本。

对于Project Euler问题,我经常使用PyPy,对于简单的数值计算,通常从__future__导入除法就足以满足我的目的,但截至2018年,Python 3支持仍在开发中,最好的选择是在64位Linux上。截至2018年12月的最新版本Windows PyPy3.5 v6.0处于测试阶段。

其他回答

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

支持的Python版本

引用Python的禅意:

可读性。

例如,Python 3.8引入了fstring =。

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

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

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

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

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

CPython有引用计数和垃圾收集,PyPy只有垃圾收集。

因此,对象倾向于更早地删除,并且在CPython中以更可预测的方式调用__del__。有些软件依赖于这种行为,因此它们还没有准备好迁移到PyPy。

其他一些软件可以同时使用这两种方法,但使用CPython时使用的内存更少,因为未使用的对象会更早释放。(我没有任何测量方法来表明这有多重要,以及其他哪些实现细节会影响内存使用。)