我听说了很多关于PyPy项目的事情。他们声称它比他们网站上的CPython解释器快6.3倍。
每当我们谈论像Python这样的动态语言时,速度是首要问题之一。为了解决这个问题,他们说PyPy要快6.3倍。
第二个问题是并行性,即臭名昭著的全局解释器锁(GIL)。为此,PyPy说它可以提供无gil的Python。
如果PyPy可以解决这些巨大的挑战,那么它的弱点是什么?也就是说,是什么阻止了像我这样的典型的Python开发人员现在转向PyPy ?
我听说了很多关于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处于测试阶段。
其他回答
对于许多项目,不同的python之间在速度方面实际上是0%的差异。这是由工程时间主导的,所有的python都有相同数量的库支持。
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处于测试阶段。
问:如果与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垃圾收集器的增量特性。
支持的Python版本
引用Python的禅意:
可读性。
例如,Python 3.8引入了fstring =。
Python 3.8+中可能有其他对您更重要的特性。PyPy目前不支持Python 3.8+。
无耻的自我广告:Python版本的杀手特性-如果你想知道更多你使用旧Python版本时错过的东西
该网站并没有声称PyPy比CPython快6.3倍。引用:
所有基准测试的几何平均值比CPython快0.16或6.3倍
这是一个与您所做的概括性陈述非常不同的陈述,当您理解其中的区别时,您将至少理解为什么不能只说“使用PyPy”的一组原因。这听起来像是我在挑刺,但理解为什么这两种说法完全不同是至关重要的。
具体来说:
他们的陈述只适用于他们使用过的基准测试。它完全没有说明您的程序(除非您的程序与他们的一个基准测试完全相同)。 这个陈述是关于一组基准的平均值。即使是他们测试过的程序,也没有人声称运行PyPy会带来6.3倍的改进。 没有人声称PyPy能运行CPython运行的所有程序,更不用说更快了。