为什么不应该';如果PyPy的速度是CPython的6.3倍,我会使用PyPy而不是CPython吗?
我一直听到很多关于这个项目的消息。他们声称,这是6.3倍的速度比翻译上 每当我们谈论像Python这样的动态语言时,速度是首要问题之一。为了解决这个问题,他们说PyPy的速度要快6.3倍 第二个问题是并行性,即臭名昭著的(GIL)。对于这一点,皮皮说了算为什么不应该';如果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来编译,是一个移动的目标,而且是高度实验性
如果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仅仅在比特上移动并没有那么快。对于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))