168

我在看PyPy,我只是想知道为什么它没有被主流 Python 发行版采用。像 JIT 编译和更低的内存占用这样的事情不会大大提高所有 Python 代码的速度吗?

简而言之,导致 PyPy 仍然是一个单独的项目的主要缺点是什么?

4

6 回答 6

253

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 非常适合游戏,但大多数像 PyPy 中使用的 GC 策略会导致明显的抖动。对于 CPython,大部分 CPU 密集型游戏内容被卸载到 PyGame 库,PyPy 无法利用它,因为 PyGame 主要是作为 C 扩展实现的(尽管参见:pygame-cffi)。我仍然认为 PyPy 可以成为一个很棒的游戏平台,但我从未见过它实际使用过。

PyPy 和 CPython 对基本设计问题有完全不同的方法并做出不同的权衡,因此在每种情况下,没有一个比另一个“更好”。

于 2012-10-12T21:35:10.543 回答
63

一方面,它与 Python 2.x不是 100% 兼容,并且仅对3.x提供初步支持。

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

PyPy 和 CPython 之间有一些非常具体的区别,一个很大的区别是扩展模块的支持方式——如果你想超越标准库,这很重要。

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

于 2012-10-12T21:22:43.330 回答
56

请参阅Guido van Rossum 的此视频。他谈到了您在 12 分 33 秒时提出的相同问题。

强调:

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

毕竟,他是决定...

于 2012-10-12T21:28:04.690 回答
15

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

于 2012-10-12T21:27:27.057 回答
7

我建议观看David Beazley的这个主题演讲以获得更多见解。它通过阐明 PyPy 的性质和复杂性来回答您的问题。

于 2012-10-13T17:52:09.457 回答
6

除了这里所说的一切,PyPy 在 bug 方面并不像 CPython 那样坚如磐石。使用 SymPy,在过去几年中,我们在 PyPy 中发现了大约十几个错误,无论是在发布版本中还是在 nightlies 中。

另一方面,我们只在 CPython 中发现了一个错误,那就是在预发布版本中。

另外,不要忽视缺乏 Python 3 支持。核心 Python 社区中的任何人都不再关心 Python 2。他们正在研究 Python 3.4 中的下一件大事,这将是 Python 3 的第五个主要版本。PyPy 家伙还没有得到其中之一。因此,在他们开始成为竞争者之前,他们还有一些工作要做。

不要误会我的意思。PyPy 很棒。但在很多非常重要的方面,它仍然远未优于 CPython。

顺便说一句,如果你在 PyPy 中使用 SymPy,你不会看到更小的内存占用(或加速)。请参阅https://bitbucket.org/pypy/pypy/issues/1447/

于 2013-05-14T06:41:25.623 回答