问题:为什么标准Python中不包含PyPy?
我在看PyPy,我只是想知道为什么它没有被主流Python发行版所采用。诸如JIT编译和较低的内存占用量之类的方法不会大大提高所有Python代码的速度吗?
简而言之,PyPy的主要缺陷是什么?
回答 0
PyPy不是CPython的分支,因此永远不能将其直接合并到CPython中。
从理论上讲,Python社区可以普遍采用PyPy,可以将PyPy用作参考实现,而可以停止CPython。但是,PyPy有其自身的弱点:
- CPython易于与用C编写的Python模块集成,这是传统上Python应用程序处理CPU密集型任务的方式(例如,参见SciPy项目)。
- PyPy JIT编译步骤本身要花费CPU时间-仅通过重复运行已编译的代码,它才能整体上更快。这意味着启动时间可能会更长,因此PyPy对于运行胶水代码或琐碎的脚本不一定有效。
- PyPy和CPython行为在所有方面都不完全相同,尤其是涉及“实现细节”时(该行为不是语言指定的,但在实际水平上仍然很重要)。
- CPython比PyPy可以在更多的体系结构上运行,并且已经成功地适应了以PyPy不可行的方式在嵌入式体系结构中运行。
- CPython的内存管理参考计数方案可以说比PyPy的各种GC系统具有更可预测的性能影响,尽管不一定对所有“纯GC”策略都如此。
- PyPy尚未完全支持Python 3.x,尽管这是一个活跃的工作项目。
PyPy是一个很棒的项目,但是CPU密集型任务的运行速度并不是全部,在许多应用程序中,它是许多关注中最少的。例如,Django可以在PyPy上运行,这使得模板化更快,但是CPython的数据库驱动程序比PyPy的更快。最后,哪种实现方式更有效取决于给定应用程序的瓶颈所在。
另一个例子:您认为PyPy非常适合游戏,但是大多数GC策略(例如PyPy中使用的GC策略)都会引起明显的抖动。对于CPython,大多数占用大量CPU的游戏资源都已转移到PyGame库中,因为PyGame主要是作为C扩展实现的,所以PyPy无法利用(尽管参见:pygame-cffi)。我仍然认为PyPy可以成为游戏的绝佳平台,但我从未见过它的实际用途。
PyPy和CPython在基本设计问题上有根本不同的方法,并会做出不同的权衡,因此在每种情况下,两者都不比另一个“更好”。
回答 1
例如,它与Python 2.x 并非100%兼容,并且仅对3.x 具有初步支持。
它也不是可以合并的东西-PyPy提供的Python实现是使用他们创建的框架生成的,该框架非常酷,但也与现有的CPython实现完全不同。它必须是一个完整的替代品。
PyPy和CPython之间有一些非常具体的区别,其中一个很大的区别就是扩展模块的支持方式-如果您想超越标准库,那就太重要了。
还值得注意的是,PyPy并非普遍都更快。
回答 2
回答 3
根据PyPy网站的说法,一个原因可能是它目前仅在32位和64位Intel x86架构上运行,而CPython也可以在其他平台上运行。这可能是由于PyPy中特定于平台的速度增强所致。虽然速度是一件好事,但人们通常希望语言实现尽可能与“平台无关”。
回答 4
我建议观看David Beazley的主题演讲,以获取更多见解。它通过阐明PyPy的性质和复杂性来回答您的问题。
回答 5
除了这里所说的一切之外,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/。