我在看PyPy,我只是想知道为什么它没有被主流Python发行版所采用。诸如JIT编译和较低的内存占用量之类的方法不会大大提高所有Python代码的速度吗?
简而言之,PyPy的主要缺陷是什么?
我在看PyPy,我只是想知道为什么它没有被主流Python发行版所采用。诸如JIT编译和较低的内存占用量之类的方法不会大大提高所有Python代码的速度吗?
简而言之,PyPy的主要缺陷是什么?
Answers:
PyPy不是CPython的分支,因此永远不能将其直接合并到CPython中。
从理论上讲,Python社区可以普遍采用PyPy,可以将PyPy用作参考实现,而可以停止CPython。但是,PyPy有其自身的弱点:
PyPy是一个很棒的项目,但是CPU密集型任务的运行速度并不是全部,在许多应用程序中,它是许多关注中最少的。例如,Django可以在PyPy上运行,这使得模板化更快,但是CPython的数据库驱动程序比PyPy的更快。最后,哪种实现方式更有效取决于给定应用程序的瓶颈所在。
另一个例子:您认为PyPy非常适合游戏,但是大多数GC策略(例如PyPy中使用的GC策略)都会引起明显的抖动。对于CPython,大多数占用大量CPU的游戏资源都已转移到PyGame库中,因为PyGame主要是作为C扩展实现的,所以PyPy无法利用(尽管参见:pygame-cffi)。我仍然认为PyPy可以成为游戏的绝佳平台,但我从未见过它的实际用途。
PyPy和CPython在基本设计问题上有根本不同的方法,并会做出不同的权衡,因此在每种情况下,两者都不比另一个“更好”。
根据PyPy网站的说法,一个原因可能是它目前仅在32位和64位Intel x86架构上运行,而CPython也可以在其他平台上运行。这可能是由于PyPy中特定于平台的速度增强所致。虽然速度是一件好事,但人们通常希望语言实现尽可能与“平台无关”。
我建议观看David Beazley的主题演讲,以获取更多见解。它通过阐明PyPy的性质和复杂性来回答您的问题。
除了这里所说的一切之外,PyPy在错误方面还不如CPython坚如磐石。使用SymPy,在过去的几年中,我们发现了PyPy中大约有十二个错误,无论是发布版本还是夜间版本。
另一方面,我们在CPython中只发现了一个bug,而该bug在一个预发行版本中。
另外,不要轻视缺少Python 3支持的情况。核心Python社区中甚至没有人再关心Python 2。他们正在研究Python 3.4的下一个重要功能,这将是Python 3的第五个主要版本。PyPy家伙还没有一个。因此,在开始成为竞争者之前,他们还有一些工作要做。
不要误会我的意思。PyPy很棒。但是在许多非常重要的方面,它仍然远没有比CPython更好。
顺便说一句,如果您在PyPy中使用SymPy,则不会看到较小的内存占用(或加速)。参见https://bitbucket.org/pypy/pypy/issues/1447/。