PyPy怎么能比Cpython快

PyPy怎么能比Cpython快,pypy,Pypy,我读过很多书和其他东西,但我不明白用Python编写的东西是如何比Python本身更快的 我能想到的唯一方法是PyPy以某种方式绕过C,直接编译成汇编语言指令。如果是这样的话,那就好了 有人能给我解释一下PyPy是怎么工作的吗?我需要一个简单的答案 我喜欢python,想开始贡献自己的力量。不管他们是否拉我的代码,PyPy看起来都是一个很棒的起点。但我无法从我所做的简短研究中理解。Pypy有JIT(即时)编译。JIT编译可以在运行时进行优化(因为它不是预编译的) 代码不会从一开始就编译为汇编或C

我读过很多书和其他东西,但我不明白用Python编写的东西是如何比Python本身更快的

我能想到的唯一方法是PyPy以某种方式绕过C,直接编译成汇编语言指令。如果是这样的话,那就好了

有人能给我解释一下PyPy是怎么工作的吗?我需要一个简单的答案

我喜欢python,想开始贡献自己的力量。不管他们是否拉我的代码,PyPy看起来都是一个很棒的起点。但我无法从我所做的简短研究中理解。

Pypy有JIT(即时)编译。JIT编译可以在运行时进行优化(因为它不是预编译的)

代码不会从一开始就编译为汇编或C。它是解释代码(在Pypy解释器中运行)。然后,解释器可以“及时”进行编译

关于“it拥有JIT”的回答在技术上是正确的,但还不够。PyPy作为Python代码运行,通过Python解释器,可以JIT编译它所解释的Python代码(事实上,JIT测试通常是以这种方式运行的),但是仍然非常慢(可能需要几分钟才能开始解释)

缺少的部分在JIT之前,实际上是JIT所必需的,它在Python的一个受限子集(称为RPython)中编写解释器,然后将其编译为C代码。这样,您就得到了一个大致在C抽象级别上运行的程序(尽管它是作为更高抽象级别编写的)。从历史上看,这个解释器一直比CPython慢,而且AFAIK现在仍然比CPython慢,但不会慢几个数量级(就像一个解释器那样)

您关于“直接编译到程序集”的评论暴露了您的困惑。汇编代码并不会自动比C代码快——事实上,在生成汇编代码方面,您很难打败今天的C编译器,而且C代码更容易编写和/或生成,即使不涉及整个可移植性混乱。问题不是将Python转换成C或汇编语言(看看Nuitka),而是以更有效的方式解释程序,而不影响语义。直接进行汇编并不能解决任何困难的问题,使为更高效的程序生成代码这一相对简单的问题变得更加困难,而且很少允许使用C语言无法表达的任何优化

现在,PyPy的JIT确实会生成机器代码,但是PyPy可执行文件是由C编译器从C代码编译而来的。如果PyPy开发人员试图在单个平台上与现有的C编译器竞争,更不用说在多个平台上了,他们将是白痴。幸运的是,他们不是白痴,他们知道这一点。让JIT生成汇编代码的原因是不同的,而且要好得多(对于初学者来说,在JIT的上下文中,有一些优化是用C无法实现的)


顺便说一句,我上面写的大部分内容也在您链接到的问题的答案中进行了说明。

PyPy本身是用RPython编写的,RPython是Python的一个受限子集。虽然您可以在CPython上运行它,但它非常慢,因此您可以将这个RPython转换为C,从而绕过解释。从理论上讲,这已经可以比CPython快,但实际上要慢很多。除此之外,还实现了一个即时编译器(同样在RPython中),它将Python编译成汇编程序


简而言之,在运行时的任何时间点都不涉及实际的双重解释,因此没有问题。

理解PyPy的最简单方法是忘记它是用Python实现的

它实际上不是,无论如何,它是在RPython中实现的。RPython可以通过Python解释器运行,但是Python代码不能通过RPython编译器(pypypy翻译框架)编译。RPython是Python的一个子集,但是被“忽略”的部分是非常重要的,因此用RPython编程与通常用Python编程非常不同

>既然Python代码不能被当作Rpython代码,而惯用的Rpython程序“外观和感觉”与惯用的Python程序非常不同,让我们完全忽略连接,并考虑一个虚构的例子。 假设我开发了一种新的语言,Frobble,带有编译器。我用Frobble编写了一个Python解释器。我声称我的“FrobblePython”解释器通常比CPython解释器快很多

你觉得这是奇怪还是不可能?当然不是。一个新的Python解释器可以比CPython解释器更快或更慢(或者更可能的是,通过不同的边距,在某些方面更快,在其他方面更慢)。它是否更快将取决于FrobblePython的实现,以及我的Frobble编译器编译的代码的性能特征


这正是你应该如何看待PyPy解释器的。用于实现它的语言RPython恰好能够被Python解释器解释(外部结果与编译RPython程序并运行它相同),这一事实与理解它的速度完全无关。重要的是PyPy解释器的实现,以及RPython编译器编译的代码的性能特征(例如,RPython编译器可以自动向其编译的程序添加某些类型的JIT功能)。

complex stuff man。如果我想尝试像那样的事情,我需要真正学到很多东西。Pypy为你做一切。大多数python代码,您将能够在Pypy中运行它。我认为你在这一点上向Pypy捐款是不合理的。从获得所需的技术知识开始;这可能是一个漫长的过程。@fijal解释自己。因为答案是co