如果PyPy的速度提高了6.3倍,为什么我不应该在Python上使用PyPy?


Answers

该网站并没有声称PyPy比CPython快6.3倍。 去引用:

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

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

打破这一点:

  • 他们所作的陈述仅适用于他们使用的基准。 它对你的程序一无所知(除非你的程序和他们的基准程序完全一样)。

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

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

Question

我一直听到很多关于PyPy项目的消息。 他们声称它比他们网站上的CPython解释器快6.3倍。

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

第二个问题是并行,即臭名昭着的全球口译员锁 (GIL)。 为此,PyPy说它可以给GIL少的Python

如果PyPy能够解决这些重大挑战,那么它有哪些弱点会阻止更广泛的采用? 也就是说,什么阻止像我这样的典型Python开发人员现在转向PyPy?




对于很多项目来说,不同的蟒蛇在速度上实际上存在0%的差异。 那些工程时间占主导地位,所有蟒蛇都有相同数量的图书馆支持。




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

BDFL和CPython开发人员是一群非常聪明的人,并且设法帮助CPython在这种情况下表现出色。 这是一个无耻的博客插件: http://www.hydrogen18.com/blog/unpickling-buffers.htmlhttp://www.hydrogen18.com/blog/unpickling-buffers.html 。 我使用了从CPython派生的Stackless,并保留了完整的C模块接口。 在这种情况下,我没有发现使用PyPy的好处。




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

至于第一个问题,我认为它是第一个Catch-22:PyPy一直在迅速发展,以提高速度并增强与其他代码的互操作性。 这使得它比官方更具实验性。

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




我找到了一些例子,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倍的速度。




Related