chh*_*yal 660 python performance jit pypy cpython
我一直听到很多关于PyPy项目的消息.他们声称它比他们网站上的CPython解释器快6.3倍.
每当我们谈论像Python这样的动态语言时,速度是最重要的问题之一.为了解决这个问题,他们说PyPy的速度要快6.3倍.
第二个问题是并行性,臭名昭着的全球口译锁(GIL).为此,PyPy表示它可以提供无GIL的Python.
如果PyPy可以解决这些巨大的挑战,它的弱点是什么阻碍了更广泛的采用?也就是说,什么阻止像我这样的人,一个典型的Python开发人员,现在切换到PyPy ?
Vee*_*rac 642
我会说,这些是影响我的主要原因.
注意:这个问题很古老!避免从过时的信息中得出结论.
spo*_*key 102
该网站并未声称PyPy比CPython快6.3倍.报价:
所有基准测试的几何平均值比CPython快0.16或6.3倍
这是对你所做的一揽子陈述的一个非常不同的陈述,当你理解这些差异时,你至少会理解为什么你不能只说"使用PyPy"的一组理由.这可能听起来像是挑剔,但理解为什么这两个陈述完全不同是至关重要的.
打破这种情况:
他们所作的陈述仅适用于他们使用的基准.它绝对没有说明你的程序(除非你的程序与他们的一个基准测试完全相同).
该声明大约是一组基准的平均值.没有人声称即使对于他们测试的程序,运行PyPy也会提高6.3倍.
没有人声称PyPy甚至会运行CPython运行的所有程序,更不用说更快了.
Tri*_*m21 69
因为pypy不是100%兼容,需要8 gig ram来编译,是一个移动目标,并且是高度实验性的,其中cpython是稳定的,模块构建器的默认目标是20年(包括在pypy上不起作用的c扩展) ),已经广泛部署.
Pypy可能永远不会成为参考实现,但它是一个很好的工具.
Bre*_*arn 35
第二个问题更容易回答:如果您的所有代码都是纯Python,那么您基本上可以使用PyPy作为替代品.但是,许多广泛使用的库(包括一些标准库)都是用C语言编写的,并编译为Python扩展.其中一些可以与PyPy一起使用,有些则不能.PyPy提供了与Python相同的"前向"工具---也就是说,它是Python ---但它的内脏是不同的,因此与这些内部接口的工具将无法工作.
至于第一个问题,我认为它是第一个问题的第二个问题:PyPy一直在快速发展,以提高速度并增强与其他代码的互操作性.这使它比官方更具实验性.
我认为如果PyPy进入稳定状态,它可能会开始得到更广泛的使用.我也认为Python离开它的C基础是很好的.但它不会发生一段时间.PyPy还没有达到临界质量的地方是几乎足以对自己有用的做你想要的一切,这将激励人们以填补空白.
Eri*_*ban 14
我在这个主题上做了一个小基准.虽然许多其他海报都对兼容性提出了很好的观点,但我的经验是PyPy并不是那么快就可以移动比特.对于Python的许多用途,它实际上只存在于两个或多个服务之间转换位.例如,没有多少Web应用程序正在执行数据集的CPU密集型分析.相反,它们从客户端获取一些字节,将它们存储在某种数据库中,然后将它们返回给其他客户端.有时,数据的格式会发生变化.
BDFL和CPython开发人员是一群非常聪明的人,并且能够帮助CPython在这种情况下表现出色.这是一个无耻的博客插件:http://www.hydrogen18.com/blog/unpickling-buffers.html.我正在使用Stackless,它源自CPython并保留了完整的C模块接口.在这种情况下,我没有发现使用PyPy有任何好处.
小智 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垃圾收集器的增量特性.
CPython有引用计数和垃圾收集,PyPy只有垃圾收集.
所以对象往往会被删除,并且__del__
在CPython中以更可预测的方式被调用.有些软件依赖于这种行为,因此它们还没有准备好迁移到PyPy.
其他一些软件可以同时使用这两种软件,但CPython使用的内存较少,因为之前释放的是未使用的对象.(我没有任何测量结果表明这是多么重要以及其他实现细节会影响内存使用.)
对于很多项目来说,不同的python在速度上实际上有0%的差异。那就是那些以工程时间为主并且所有 python 都具有相同数量库支持的那些。
简单起见:PyPy 提供了 CPython 所缺乏的速度,但牺牲了其兼容性。然而,大多数人选择 Python 是因为它的灵活性和“内置电池”特性(高兼容性),而不是它的速度(尽管它仍然是首选)。
我找到了一些例子,其中 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
Run Code Online (Sandbox Code Playgroud)
因此,如果您想到 PyPy,请忘记 Windows。在 Linux 上,您可以实现惊人的加速。示例(列出 1 到 1,000,000 之间的所有素数):
from sympy import sieve
primes = list(sieve.primerange(1, 10**6))
Run Code Online (Sandbox Code Playgroud)
这在 PyPy 上的运行速度比在 Python 上快 10(!) 倍。但不是在窗户上。在那里它只有 3 倍的速度。