为什么PyPy不包含在标准的Python中?
我在看PyPy ,我只是想知道为什么它没有被采纳到主stream的Python发行版中。 不会像JIT编译和更低的内存占用大大提高所有Python代码的速度?
总之,PyPy的主要缺点是什么导致它仍然是一个单独的项目?
PyPy不是CPython的一个分支,所以它不能直接合并到CPython中。
理论上Python社区可以普遍采用PyPy,PyPy可以作为参考实现,CPython可以停止。 然而,PyPy有其自身的弱点:
- CPython很容易与用C语言编写的Python模块集成,这是传统的Python应用程序处理CPU密集型任务的方式(例如参见SciPy项目)。
- PyPy JIT编译步骤本身要花费CPU时间 – 只有通过重复运行编译代码才能使整体变得更快。 这意味着启动时间可能会更长,因此PyPy对于运行胶合代码或平凡的脚本来说不一定是有效的。
- PyPy和CPython在所有方面的行为并不完全相同,特别是当涉及到“实现细节”(行为不是由语言指定,但在实践层面上仍然很重要)时。
- CPython运行在比PyPy更多的体系结构上,并且已经成功地适应于以对于PyPy不切实际的方式在embedded式体系结构中运行。
- CPython的内存pipe理参考计数scheme可以说比PyPy的各种GC系统具有更可预测的性能影响,虽然在所有的“纯GC”策略中并不一定如此。
- PyPy还没有完全支持Python 3.x,尽pipe这是一个活跃的工作项目。
PyPy是一个伟大的项目,但CPU密集型任务的运行时速度并不是一切,在许多应用程序中,这是很多问题中最less的。 例如,Django可以在PyPy上运行,这使模板更快,但CPython的数据库驱动程序比PyPy更快; 最后,哪个实现更有效率取决于给定应用程序的瓶颈。
另一个例子:你会认为PyPy对于游戏来说很棒,但是像PyPy中使用的大多数GC策略会引起明显的抖动。 对于CPython来说,大部分CPU密集型游戏的东西都被卸载到了PyGame库中,PyGame库是PyPame不能利用的,因为PyGame主要是作为C扩展来实现的(尽pipe参见:pygame-cffi)。 我仍然认为PyPy可以成为游戏的一个很好的平台,但是我从来没有看到它实际使用过。
PyPy和CPython在基本devise问题上有着截然不同的方法,并且做出了不同的折衷,所以在任何情况下,都不比其他方法更好。
首先,它与Python 2.x 不是100%兼容 ,并且只对3.x 初步支持 。
这也不是可以合并的东西 – PyPy提供的Python实现是使用他们创build的框架生成的,这个框架非常酷,但是也完全不同于现有的CPython实现。 这将是一个完整的替代品。
PyPy和CPython之间有一些非常具体的区别 , 扩展模块是如何被支持的 – 如果你想超越标准库,这是一个很大的问题。
还值得一提的是,PyPy并不是普遍的速度。
请参阅Guido van Rossum的video 。 他谈到你在12分33秒时提出的同样的问题。
强调:
- 缺乏Python 3的兼容性
- 缺乏延伸支持
- 不适合作为胶水代码
- 速度不是一切
毕竟,他是一个决定…
一个原因可能是,根据PyPy网站,目前它只能运行在32位和64位Intel x86架构上,而CPython也可以在其他平台上运行。 这可能是由于PyPy中特定于平台的速度增强所致。 尽pipe速度是一件好事,但人们通常希望语言实现尽可能地“独立于平台”。
我build议大卫比兹利观看这个主题发言,以获得更多的见解。 它通过阐明PyPy的本质和复杂性来回答你的问题。
除了这里所说的一切之外,PyPy在缺陷方面还没有像CPython那样稳定。 有了SymPy,在过去的几年中,我们发现了PyPy中的大量漏洞,无论是发布版本还是夜晚。
另一方面,我们在CPython中只发现了一个bug,而且是在预发行中。
另外,不要打折缺乏Python 3的支持。 核心Python社区中没有人更关心Python 2。 他们正在研究Python 3.4中的下一个重大事件,这将是Python 3的第五个主要版本。PyPy的人还没有得到其中的一个。 所以在他们开始成为竞争者之前,他们已经有了一些赶上的时候了。
不要误解我的意思 PyPy真棒。 但是在很多非常重要的方面,它还远远不如CPython。
顺便说一句,如果你在PyPy中使用SymPy,你将不会看到更小的内存占用(或者加速)。 请参阅https://bugs.pypy.org/issue1447 。