如果PyPy快6.3倍,为什么我不应该使用PyPy而不是CPython?

时间:2013-09-22 17:24:14

标签: python performance jit pypy cpython

我听过很多关于PyPy项目的消息。他们声称它比CPython上的their site解释器快6.3倍。

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

第二个问题是并行性,臭名昭着的Global Interpreter Lock(GIL)。为此,PyPy说它can give GIL-less Python

如果PyPy可以解决这些巨大的挑战,它的弱点是什么阻碍了更广泛的采用?也就是说,什么阻止像我这样的人,一个典型的Python开发人员,立即切换到PyPy

12 个答案:

答案 0 :(得分:631)

  1. PyPy,正如其他人一直提到的那样,对C扩展有很强的支持。它具有支持,但通常速度比Python速度慢,而且最多也是如此。因此很多模块只需需要 CPython。对于数字而言,Cython和Numpy是 awesome ,并且大多数真正需要Python速度的人正在大量使用这些(+ Pandas,SciPy等)。由于它们要么不存在,要么得到支持,而且需要快速Python的人通常会因为速度和易用性而更好地使用CPython
  2. Python 3支持目前是实验性的。 刚刚达到稳定!截至2014年6月20日,PyPy3 2.3.1 - Fulcrum is out
  3. PyPy有时对于“脚本”实际上更快,很多人都使用Python。这些是短期运行的程序,可以做一些简单而小巧的事情。因为PyPy是一个JIT编译器,它的主要优点来自长运行时间和简单类型(例如数字)。坦率地说,与CPython相比, PyPy的JIT前速度非常差
  4. 惯性即可。迁移到PyPy通常需要重组,这对某些人和组织来说太过分了。
  5. 这些是影响我的主要原因,我会说。

      

    注意:这个问题很古老!避免从过时的信息中得出结论。

答案 1 :(得分:98)

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

  

所有基准测试的几何平均值比CPython

快0.16或6.3倍

这是对您所做的一揽子声明的非常不同的陈述,当您了解其中的差异时,您将理解为什么您不能只说“使用PyPy”的至少一组理由”。这可能听起来像我挑剔,但理解为什么这两个陈述完全不同是至关重要的。

要打破这一点:

  • 他们所作的陈述仅适用于他们使用的基准。它完全没有说明你的程序(除非你的程序与他们的基准程序完全相同)。

  • 该陈述是关于一组基准的平均值。没有人声称即使对于他们测试过的程序,运行PyPy也会提高6.3倍。

  • 没有人声称PyPy甚至会运行CPython运行的所有程序,更不用说更快了。

答案 2 :(得分:68)

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

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

答案 3 :(得分:35)

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

关于第一个问题,我认为它与第一个问题有点差异:PyPy一直在快速发展,以提高速度并增强与其他代码的互操作性。这使它比官方更具实验性。

我认为如果PyPy进入稳定状态,它可能会开始得到更广泛的使用。我也认为Python离开它的C基础是很好的。但它不会发生一段时间。 PyPy尚未达到临界质量,它本身几乎足够有用,可以做你想做的一切,这将激励人们填补空白。

答案 4 :(得分:14)

我在这个主题上做了一个小基准。虽然许多其他海报都对兼容性提出了很好的观点,但我的经验是PyPy并不是那么快就可以移动比特。对于Python的许多用途,它实际上只存在于两个或多个服务之间转换位。例如,没有多少Web应用程序正在执行数据集的CPU密集型分析。相反,它们从客户端获取一些字节,将它们存储在某种数据库中,然后将它们返回给其他客户端。有时数据的格式会发生变化。

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

答案 5 :(得分:12)

问:与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与CPython不是100%兼容,因为它不是模拟CPython。有些程序可能仍然依赖于CPython在PyPy中缺少的独特功能,例如C绑定,Python对象和方法的C实现,或者CPython垃圾收集器的增量特性。

答案 6 :(得分:7)

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

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

其他一些软件同时适用于两者,但在CPython中使用的内存较少,因为之前释放了未使用的对象。 (我没有任何测量结果表明这是多么重要以及其他实现细节会影响内存使用。)

答案 7 :(得分:5)

我找到了一些例子,其中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倍。

答案 8 :(得分:4)

对于很多项目来说,不同的蟒蛇在速度方面实际上有0%的差异。那是由工程时间占主导地位的地方,并且所有蟒蛇都拥有相同数量的库支持。

答案 9 :(得分:4)

为了简单起见:PyPy提供了CPython所缺乏的速度,但牺牲了它的兼容性。然而,大多数人选择Python的灵活性和包含电池的#34;功能(高兼容性),而不是它的速度(虽然它仍然是首选)。

答案 10 :(得分:1)

PyPy支持Python 3已有一段时间了,但是根据HackerNoon post by Anthony Shaw from April 2nd, 2018,PyPy3仍然比PyPy(Python 2)慢几倍。

对于许多科学计算,尤其是矩阵计算,numpy是更好的选择(请参见FAQ: Should I install numpy or numpypy?)。

Pypy does not support gmpy2.,尽管我尚未测试其速度,并且该项目在2014年发布了一个版本,但您可以使用gmpy_cffi

对于Project Euler问题,我经常使用PyPy,并且对于简单的数值计算而言,from __future__ import division通常足以满足我的需求,但是截至2018年,Python 3支持仍在开发中,最好的选择是在64位Linux上。 Windows PyPy3.5 v6.0(截至2018年12月)是最新测试版。

答案 11 :(得分:1)

受支持的Python版本

引用Zen of Python

可读性计数。

例如,Python 3.7引入了dataclasses,Python 3.8引入了fstring =

Python 3.7和Python 3.8中可能还有其他更重要的功能。关键是PyPy目前不支持Python 3.7或Python 3.8。

无耻的自我宣传:Killer Features by Python version-如果您想了解更多使用较旧的Python版本而错过的事情