我在看PyPy,我只是想知道为什么它没有被主流 Python 发行版采用。像 JIT 编译和更低的内存占用这样的事情不会大大提高所有 Python 代码的速度吗?
简而言之,导致 PyPy 仍然是一个单独的项目的主要缺点是什么?
PyPy 不是 CPython 的一个分支,因此它永远不能直接合并到 CPython 中。
理论上 Python 社区可以普遍采用 PyPy,PyPy 可以作为参考实现,CPython 可以停止使用。然而,PyPy 也有自己的弱点:
PyPy 是一个很棒的项目,但 CPU 密集型任务的运行时速度并不是一切,在许多应用程序中它是最不关心的问题。例如,Django 可以在 PyPy 上运行,这使得模板更快,但 CPython 的数据库驱动程序比 PyPy 的快;最后,哪种实现更有效取决于给定应用程序的瓶颈在哪里。
另一个例子:你会认为 PyPy 非常适合游戏,但大多数像 PyPy 中使用的 GC 策略会导致明显的抖动。对于 CPython,大部分 CPU 密集型游戏内容被卸载到 PyGame 库,PyPy 无法利用它,因为 PyGame 主要是作为 C 扩展实现的(尽管参见:pygame-cffi)。我仍然认为 PyPy 可以成为一个很棒的游戏平台,但我从未见过它实际使用过。
PyPy 和 CPython 对基本设计问题有完全不同的方法并做出不同的权衡,因此在每种情况下,没有一个比另一个“更好”。
一方面,它与 Python 2.x不是 100% 兼容,并且仅对3.x提供初步支持。
它也不是可以合并的东西——PyPy 提供的 Python 实现是使用他们创建的框架生成的,这非常酷,但也与现有的 CPython 实现完全不同。它必须是一个完整的替代品。
PyPy 和 CPython 之间有一些非常具体的区别,一个很大的区别是扩展模块的支持方式——如果你想超越标准库,这很重要。
还值得注意的是,PyPy 并不是普遍更快。
请参阅Guido van Rossum 的此视频。他谈到了您在 12 分 33 秒时提出的相同问题。
强调:
毕竟,他是决定...
一个原因可能是,根据PyPy网站,它目前仅在 32 位和 64 位 Intel x86 架构上运行,而 CPython 也可以在其他平台上运行。这可能是由于 PyPy 中特定于平台的速度增强。虽然速度是一件好事,但人们通常希望语言实现尽可能“独立于平台”。
我建议观看David Beazley的这个主题演讲以获得更多见解。它通过阐明 PyPy 的性质和复杂性来回答您的问题。
除了这里所说的一切,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/。