为什么标准Python中不包含PyPy?


165

我在看PyPy,我只是想知道为什么它没有被主流Python发行版所采用。诸如JIT编译和较低的内存占用量之类的方法不会大大提高所有Python代码的速度吗?

简而言之,PyPy的主要缺陷是什么?



而且,numpy支持仅覆盖了转换到PyPy之前科学计算应用程序所需的内容。下面是从原来的numpy的作者一些切实的想法:technicaldiscovery.blogspot.com/2011/10/...
斯图尔特伯格

3
我认为这些答案和评论已过时
Marlon Abeykoon '16

Answers:


249

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在基本设计问题上有根本不同的方法,并会做出不同的权衡,因此在每种情况下,两者都不比另一个“更好”。


4
PyPy不适合运行脚本是不正确的。它的启动时间与CPython差不多,并且解释速度也差不多。
Lucian

6
值得注意的是,PyPy现在带有增量GC,因此可能更适合于游戏。
porgarmingduod

63

例如,它与Python 2.x 并非100%兼容,并且仅对3.x 具有初步支持

它也不是可以合并的东西-PyPy提供的Python实现是使用他们创建的框架生成的,该框架非常酷,但也与现有的CPython实现完全不同。它必须是一个完整的替代品。

PyPy和CPython之间有一些非常具体的区别,其中一个很大的区别就是扩展模块的支持方式-如果您想超越标准库,那就太重要了。

还值得注意的是,PyPy并非普遍都更快。


54

观看Guido van Rossum的这段视频。他谈论您在12分33秒时问的相同问题。

强调:

  • 缺乏Python 3兼容性
  • 缺乏扩展支持
  • 不适合作为胶水代码
  • 速度不是一切

毕竟,他是决定的人...


3
+1链接,直接链接到视频的相关部分!对于狂热的真实的Guido van Rossum非正式民意测验也+1,“有多少人在生产中使用PyPy?……没有手?咳嗽,我想[对于CPython]还是有希望的。”
Trevor Boyd Smith

15

根据PyPy网站的说法,一个原因可能是它目前仅在32位和64位Intel x86架构上运行,而CPython也可以在其他平台上运行。这可能是由于PyPy中特定于平台的速度增强所致。虽然速度是一件好事,但人们通常希望语言实现尽可能与“平台无关”。


6
请注意,ARM后端“几乎在那儿”,而PowerPC后端是WIP。还要注意,这仅是指JIT编译器,并且将JIT移植到新的体系结构仅需要为相对简单和低级的IR实现代码生成器,仅此而已。

1
截至2018年,PyPy现在可以在更多架构 x86 上运行(在Linunx,Windows,MacOS和BSD上为32/64位),但在Linux上也可以使用较新的ARM硬件(ARMv6或ARMv7,以及VFPv3),大端和小端PPC64和s390x的变体。
弗雷德里克Grosshans


6

除了这里所说的一切之外,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/


2
截至2018年,我可以证实,我已经看到了大致的不同sympy用途数量级的加速
弗雷德里克Grosshans

1
@FrédéricGrosshans有趣。我将不得不再次尝试对其进行基准测试。
asmeurer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.