【问题标题】:PyPy: What is all the buzz about? [closed]PyPy:所有的嗡嗡声是什么? [关闭]
【发布时间】:2011-02-27 13:05:59
【问题描述】:

注意:标题是故意挑衅的(让你点击它并想要对问题进行近距离投票),我不想看起来全神贯注。

我一直在阅读和听到越来越多关于PyPy 的信息。它就像一个线性图。

  • 为什么 PyPy 如此特别?据我所知,用语言本身编写的动态语言的实现并不罕见,或者我没有得到什么?

  • 有些人甚至将 PyPy 称为 [python] 的“未来”,或者在此实现中看到某种深层次的潜力。这究竟是什么意思?

【问题讨论】:

  • 当务之急是什么?
  • 其实这个词的“挑衅”我认为是 Manglish 的“挑衅”。
  • 我必须承认有点困惑
  • (preoccupate) 影响,提前占据(头脑);被全神贯注;提前见面;预防,先发制人
  • 这应该很清楚了:morepypy.blogspot.co.uk/2011/04/…

标签: python pypy


【解决方案1】:

在谈论 PyPy 项目时要注意的是,它实际上旨在提供两个可交付成果:首先是 JIT 编译器生成器。是的,生成器,这意味着他们正在实现一个框架,用于编写高度动态的编程语言(例如 Python)的实现。第二个是对这个框架的实际测试,是PyPy Python解释器实现

现在,为什么 PyPy 如此特别有多个答案:项目开发从 2004 年开始,从研究项目开始而不是从公司开始,在 Python 中重新实现 Python,在 Python 中实现 JIT 编译器,并且可以翻译 RPython (Python 代码有一些限制,框架能够将该代码转换为 C)到编译的二进制文件。

当前版本的 PyPy99% 兼容 CPython 2.5 版,可以运行 Django、Twisted 和许多其他 Python 程序。过去存在无法运行现有 CPython C 扩展的限制,但 PyPy 中的 cpyext 模块也解决了这个问题。 C API 兼容性是可能的,并且在某种程度上已经实现。 JIT 也很真实,看这个 pystone 对比。

使用 CPython:

Python 2.5.5 (r255:77872, Apr 21 2010, 08:44:16) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from test import pystone
>>> pystone.main(1000000)
Pystone(1.1) time for 1000000 passes = 12.28
This machine benchmarks at 81433.2 pystones/second

使用 PyPy:

Python 2.5.2 (75632, Jun 28 2010, 14:03:25)
[PyPy 1.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``A radioactive cat has 18
half-lives.''
>>>> from test import pystone
>>>> pystone.main(1000000)
Pystone(1.1) time for 1000000 passes = 1.50009
This machine benchmarks at 666625 pystones/second

因此,只需在某些计算上使用 PyPy,您就可以获得近 10 倍的加速

因此,随着 PyPy 项目逐渐成熟并提供一些优势,它吸引了试图解决代码中速度问题的人们的更多兴趣。 PyPy 的替代方案是 unladden Swallow(一个 Google 项目),旨在通过使用 LLVM 的 JIT 功能来加速 CPython 的实现,但 unladden Swallow 的进展缓慢,因为开发人员需要处理 LLVM 中的错误。

所以,总而言之,我猜 PyPy 被认为是 Python 的未来,因为它将语言规范与 VM 实现分离。中引入的功能,例如。 stackless Python,然后可以用很少的额外工作在 PyPy 中实现,因为它只是改变语言规范并且您保持共享代码相同。更少的代码,更少的错误,更少的合并,更少的工作。

例如,通过在 RPython 中编写一个新的 bash shell 实现,您可以免费获得一个 JIT 编译器并加速许多 linux shell 脚本,而无需实际学习任何大量的 JIT 知识。

【讨论】:

  • 让我直说。一个用 Python 编写的 Python 解释器并在另一个用 C 语言编写的 Python 解释器上运行,是否可以比它本身运行的程序更快地执行其他 Python 程序?如果是这样,您似乎可以再多关卡几个级别,并获得令人难以置信的快...
  • PyPy Python 解释器在 CPython 上运行时并不快。当您从另一个 Python 解释器引导它以便能够自行运行时,它会很快。因此,向堆栈添加更多解释器不会使任何事情变得更快,抱歉。 :)
  • 澄清这一点:PyPy 解释器是一个可执行文件。它是用 RPython 编写的,但是 RPython 是由 PyPy 翻译器编译的。当你编译 PyPy 解释器时,你实际上是在引导它(因为你可能会使用 CPython 来运行编译解释器的翻译器),但是一旦编译器被编译,它就是独立的。因此,仅仅因为它是用 Python 编写的,并不意味着它必须在 Python 解释器上运行。
  • @martineau - 是的。就像电影《盗梦空间》,但反过来。蟒蛇中的蟒蛇,这里仔细记录了mythologian.net/ouroboros-symbol-of-infinity
【解决方案2】:

让我们这样看... 假设你想实现你自己的动态语言,并且你想让它变得更快。 你有两个选择:hard way 和 pypy。

困难的方法是用 c 编写解释器,然后手动实现 jit,也可以在 c 中使用非常复杂的技术组合,例如方法 jit、线程 jit、跟踪 jit、多态内联缓存、循环不变的运动,等等,等等……花了几年的时间来调整它,如果你坚持不懈并且不放弃,你最终可能会得到一个快速的动态语言实现。

或者,您可以使用 pypy 框架。 这意味着,用 python 而不是 c 编写你的解释器(实际上,它将是 rpython,一个可以编译为 c 的更有限的 python 子集)。 一旦你编写了解释器,pypy 会自动免费生成一个 jit。 你基本上就完成了。

听起来不错吧?

【讨论】:

  • +1 Suppose you want to implement your own dynamic language, and you want to make it fast. You have two options: the hard way and pypy.
【解决方案3】:

PyPy 很酷的一点(除了速度快而且用 RPython(Python 语言的一个子集)编写,基本上是自举的,它可以提供一个自动创建的 JIT(即时编译器) ) 对于您用 PyPy 编写的任何程序:这使其成为快速实现您自己的语言的理想选择,并且速度相当快。

阅读更多here

【讨论】:

    【解决方案4】:

    更不用说他们最近在某些基准测试中超过了 CPython 的速度。看看他们的博客,我想。我无法从这里到达它:

    http://morepypy.blogspot.com/

    【讨论】:

      【解决方案5】:

      由于我们大多数人都认为 Python 比 C 更容易编写,因此用 Python(从技术上讲是 RPython)编写的 Python 解释器应该比 CPython 更容易修改,并且错误更少。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 2021-11-28
        • 1970-01-01
        • 2011-10-08
        • 2014-08-04
        • 2015-12-08
        • 1970-01-01
        相关资源
        最近更新 更多