为什么不应该';如果PyPy的速度是CPython的6.3倍,我会使用PyPy而不是CPython吗?

为什么不应该';如果PyPy的速度是CPython的6.3倍,我会使用PyPy而不是CPython吗?,python,performance,jit,pypy,cpython,Python,Performance,Jit,Pypy,Cpython,我一直听到很多关于这个项目的消息。他们声称,这是6.3倍的速度比翻译上 每当我们谈论像Python这样的动态语言时,速度是首要问题之一。为了解决这个问题,他们说PyPy的速度要快6.3倍 第二个问题是并行性,即臭名昭著的(GIL)。对于这一点,皮皮说了算 如果PyPy能够解决这些巨大的挑战,那么它有哪些缺点阻碍了更广泛的采用?也就是说,是什么阻止了像我这样的典型Python开发人员现在切换到PyPy 因为pypy不是100%兼容的,需要8 Gig的ram来编译,是一个移动的目标,而且是高度实验性

我一直听到很多关于这个项目的消息。他们声称,这是6.3倍的速度比翻译上

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

第二个问题是并行性,即臭名昭著的(GIL)。对于这一点,皮皮说了算


如果PyPy能够解决这些巨大的挑战,那么它有哪些缺点阻碍了更广泛的采用?也就是说,是什么阻止了像我这样的典型Python开发人员现在切换到PyPy

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


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

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

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

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

注意:PyPy现在比2013年提出这个问题时更加成熟,也得到了更好的支持。避免从过时的信息中得出结论


  • 正如其他人很快提到的,PyPy对C扩展的支持很弱。它有支持,但速度通常比Python慢,充其量也不确定。因此,许多模块只需要CPython。PyPy不支持numpy。有些扩展仍然不受支持(Pandas、SciPy等),请在进行更改之前查看一下请注意,现在支持列表中许多标记为不支持的软件包。
  • Python3支持目前处于实验阶段刚刚达到稳定状态!截至2014年6月20日
  • PyPy有时实际上并不比很多人使用Python编写的“脚本”更快。这些是短时间运行的程序,可以做一些简单而小的事情。因为PyPy是一个JIT编译器,所以它的主要优势在于运行时间长和类型简单(如数字)。PyPy的JIT前速度与CPython相比可能很差
  • 惯性。迁移到PyPy通常需要重新工具化,这对于一些人和组织来说简直是太多的工作了

  • 我想说,这些是影响我的主要原因。

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


    BDFL和CPython开发人员是一群非常聪明的人,他们有一个管理团队来帮助CPython在这样的场景中表现出色。这里有一个无耻的博客插件:。我使用的是Stackless,它源于CPython,保留了完整的C模块接口。在这种情况下,我没有发现使用PyPy的任何优势。

    该网站确实声称PyPy的速度是CPython的6.3倍。引述:

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

    这是一个非常不同于你所做的笼统陈述的陈述,当你理解了其中的区别后,你就会明白为什么你不能只说“使用PyPy”。听起来好像我在吹毛求疵,但理解为什么这两种说法完全不同是至关重要的

    要分解这一点:

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

    • 该声明是关于一组基准的平均值。没有人声称运行PyPy会使他们测试的程序的性能提高6.3倍

    • 没有人宣称PyPy甚至可以运行CPython运行的所有程序,更不用说更快了


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

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


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

        对于许多项目,都有ac
        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
        
        from sympy import sieve
        primes = list(sieve.primerange(1, 10**6))