PyPy - 它怎么可能击败CPython?

Agn*_*ian 260 python pypy language-implementation

来自Google开源博客:

PyPy是Python在Python中的重新实现,使用先进的技术来尝试获得比CPython更好的性能.多年的努力终于得到了回报.我们的速度结果经常超过CPython,从稍微慢一点到实际应用程序代码的2倍加速,在小基准测试上加速到高达10倍.

这怎么可能?哪个Python实现用于实现PyPy?CPython?PyPyPy或PyPyPyPy击败他们得分的几率是多少?

(在相关的说明中...为什么有人会尝试这样的东西?)

Ben*_*Ben 286

"PyPy是Python中Python的重新实现"是一种描述PyPy,恕我直言的相当误导的方式,尽管它在技术上是正确的.

PyPy有两个主要部分.

  1. 翻译框架
  2. 口译员

翻译框架是一个编译器.它将RPython代码编译为C(或其他目标),自动添加垃圾收集和JIT编译器等方面.它无法处理任意Python代码,只能处理RPython.

RPython是普通Python的一个子集; 所有RPython代码都是Python代码,但不是相反.RPython没有正式的定义,因为RPython基本上只是"可以通过PyPy的翻译框架翻译的Python的子集".但是为了被翻译,RPython代码必须是静态类型的(推断类型,你不声明它们,但它仍然严格地说每个变量一个类型),你不能做像声明/修改函数/运行时的类也是.

然后解释器是用RPython编写的普通Python解释器.

因为RPython代码是普通的Python代码,所以可以在任何Python解释器上运行它.但PyPy的速度声明并非都是以这种方式运行的; 这只是一个快速的测试周期,因为翻译解释器需要长时间.

有了这个,很明显,关于PyPyPy或PyPyPyPy的推测实际上没有任何意义.你有一个用RPython编写的解释器.您将其转换为快速执行Python的C代码.过程停止了; 没有更多的RPython可以通过再次处理来加快速度.

所以"PyPy如何比CPython更快"也变得相当明显.PyPy有一个更好的实现,包括一个JIT编译器(我相信它通常没有JIT编译器那么快,这意味着PyPy只对易受JIT编译的程序更快).CPython从未被设计为Python语言的高度优化实现(尽管他们确实尝试使其成为高度优化的实现,如果你遵循差异).


PyPy项目的真正创新之处在于它们不会手工编写复杂的GC方案或JIT编译器.他们在RPython中相对直接地编写解释器,并且对于所有RPython都比Python低,它仍然是面向对象的垃圾收集语言,比C更高级.然后翻译框架自动添加GC和JIT之类的东西.所以翻译框架是一项巨大的工作,但它同样适用于PyPy python解释器,但是它们改变了它们的实现,允许更多的实验自由来提高性能(不必担心引入GC错误或更新JIT编译器来应对变化).这也意味着当他们开始实现Python3解释器时,它将自动获得相同的好处.以及使用PyPy框架编写的任何其他解释器(其中有一些编号处于不同的修改阶段).所有使用PyPy框架的解释器都自动支持框架支持的所有平台.

因此,PyPy项目的真正好处是(尽可能地)分离为动态语言实现高效的平台无关解释器的所有部分.然后在一个地方提出一个很好的实现,可以在许多解释器中重复使用.这不是立刻的胜利,比如"我的Python程序现在运行得更快",但这对未来来说是一个很好的前景.

它可以更快地运行你的Python程序(也许).

  • @polvoazul*优化*语言实现和*优化*之间的区别?好吧,当我说CPython是一个优化良好的实现时,我的意思是开发人员试图使解释器本身的内部算法和内置数据结构高效运行.一个*optimize*实现,OTOH,将分析*最终用户*代码,并试图找出将其转换为更有效执行的方法. (36认同)
  • 我无法跟上差异:( (4认同)

Nou*_*him 155

Q1.这怎么可能?

在某些情况下,手动内存管理(这是CPython的计数)可能比自动管理慢.

CPython解释器的实现限制排除了PyPy可以做的某些优化(例如细粒度锁).

正如马塞洛所说,JIT.能够即时确认对象的类型可以节省您进行多个指针解引用的需要,最终到达您想要调用的方法.

Q2.哪个Python实现用于实现PyPy?

PyPy解释器在RPython中实现,RPython是Python的静态类型子集(语言而不是CPython解释器).- 有关详细信息,请参阅https://pypy.readthedocs.org/en/latest/architecture.html.

Q3.PyPyPy或PyPyPyPy击败他们得分的几率是多少?

这取决于这些假设口译员的实施情况.例如,如果其中一个接受了源代码,对它进行了某种分析并在运行一段时间后将其直接转换为紧密的目标特定汇编代码,我想它会比CPython快得多.

更新:最近,在一个精心设计的例子中,PyPy胜过一个类似的C程序编译gcc -O3.这是一个人为的案例,但确实展示了一些想法.

Q4.为什么有人会尝试这样的东西?

来自官方网站.https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement

我们的目标是提供:

  • 用于生成
    动态语言实现的通用翻译和支持框架,强调
    语言规范和实现
    方面之间的清晰分离.我们称之为RPython toolchain_.

  • Python_语言的兼容,灵活和快速实现,它使用上述工具链来启用新的高级高级功能,而无需编码低级细节.

通过以这种方式分离关注点,我们的Python实现 - 以及其他动态语言 - 能够自动为任何动态语言生成即时编译器.它还允许实现决策的混合和匹配方法,包括历史上不在用户控件之外的许多方法,例如目标平台,内存和线程模型,垃圾收集策略和应用的优化,包括是否具有首先是JIT.

C编译器gcc用C实现,Haskell编译器GHC用Haskell编写.你是否有任何理由让Python解释器/编译器不能用Python编写?

  • 这个答案完全没有错过PyPy如何快速的主要解释; 虽然它提到PyPy并没有真正用Python实现,但是在RPython中,它并没有指出RPython代码是*静态编译和优化*来生成PyPy解释器(它恰好也是可以运行的有效Python代码)在CPython之上慢得多).他们在"普通Python"中实现的是RPython"编译器"(块引用中引用的翻译框架). (80认同)
  • 这掩盖了lede.大多数性能来自转换为C(这使得解释器的速度不比CPython慢​​)和JIT,它使热路径更快. (12认同)
  • *"更新:最近,在精心设计的示例中,PyPy优于使用gcc -O3编译的类似C程序."*如果您阅读该帖子下的第一条评论,您将看到该帖子的作者不知道链接时间优化.启用链接时优化后,C代码运行得更快. (4认同)
  • 好吧,博客文章是在2011年和2014年的答案.此外,评论确实提到了共享库.我不知道这个(答案和博客文章)有多少是有效的.在过去几年中,所有涉及的技术都发生了很大变化. (2认同)

Mar*_*tos 23

PyPy是用Python实现的,但它实现了一个JIT编译器来动态生成本机代码.

在Python之上实现PyPy的原因可能是它只是一种非常高效的语言,特别是因为JIT编译器使得宿主语言的性能有些无关紧要.

  • 真正的本机代码(见[here](http://pypy.org/download.html#with-a-jit-compiler)); 准确地说是32位x86代码. (3认同)

bob*_*aul 11

PyPy是用Restricted Python编写的.据我所知,它不会在CPython解释器之上运行.受限制的Python是Python语言的子集.AFAIK,PyPy解释器被编译为机器代码,因此在安装时它不会在运行时使用python解释器.

您的问题似乎期望PyPy解释器在执行代码时运行在CPython之上. 编辑:是的,要使用PyPy,首先要将PyPy python代码翻译成C语言并使用gcc构建,使用jvm字节代码或.Net CLI代码.请参阅" 入门"

  • PyPy将在CPython之上运行,但在这种模式下它不能提供人们可能想要的速度增益.:-) http://codespeak.net/pypy/dist/pypy/doc/getting-started-python.html#id9 (8认同)