Python 3解释器是否具有JIT功能?

guz*_*guz 58 python jit python-3.x

我发现当我向Python提出更多要求时,python不会以100%的速度使用我的机器资源而且速度不是很快,与许多其他解释语言相比它速度很快,但与编译语言相比,我认为不同之处在于非常了不起.

使用Python 3中的Just In Time(JIT)编译器可以加快速度吗?

通常JIT编译器是唯一可以提高解释语言性能的东西,所以我指的是这个,如果其他解决方案可用,我很乐意接受新的答案.

小智 62

首先,Python 3(.x)是一种语言,可以有任意数量的实现.好的,直到今天,除了CPython之外没有任何实现实际上实现了该语言的那些版本.但这会改变(PyPy正在迎头赶上).

要回答你想要提出的问题:CPython,3.x或者其他方式,不会,从来没有,也可能永远不会包含JIT编译器.其他一些Python实现(PyPy本身,Jython和IronPython通过为他们构建的虚拟机重用JIT编译器)确实有一个JIT编译器.并且没有理由他们的JIT编译器在添加Python 3支持时会停止工作.

但是,当我在这里时,也让我解决一个误解:

通常,JIT编译器是唯一可以提高解释语言性能的东西

这是不正确的.JIT编译器,以其最基本的形式,只是消除了解释器开销,这可以解释您看到的一些减速,但不是大多数.一个好的 JIT编译器还执行一系列优化,这些优化消除了实现大量Python功能所需的开销(通过检测允许更有效实现的特殊情况),突出的例子是动态类型,多态和各种内省功能.

仅仅实现一个编译器不会与帮助.您需要非常聪明的优化,其中大多数仅在非常特定的情况下以及在有限的时间窗口内有效.JIT编译器在这里很容易,因为它们可以在运行时生成专用代码(这是它们的全部要点),可以通过在运行时观察它来更容易(更准确地)分析程序,并且可以在它们变为无效时撤消优化.与提前编译器不同,他们还可以与口译员互动,并且经常这样做,因为这是一个明智的设计决策.我想这就是为什么它们与人们心中的翻译有关,尽管它们可以并且确实独立存在.

除了优化解释器的代码本身之外,还有其他方法可以使Python实现更快 - 例如,HotPy(2)项目.但是那些目前处于研究或实验阶段,尚未显示其实际代码的有效性(和成熟度).

当然,特定程序的性能取决于程序本身,而不仅仅是语言实现.语言实现仅设置了一系列操作的速度的上限.通常,只需避免不必要的工作,即通过优化程序,就可以更好地提高程序的性能.无论您是通过解释器,JIT编译器还是提前编译器运行程序,都是如此.如果你想要快速的东西,不要忘记更快的语言实现.有些应用程序在解释和动态性方面的开销是不可行的,但它们并不像你想象的那么普遍(通常通过选择性地调用机器代码编译代码来解决).

  • @guz谷歌的Unladden Swallow项目很久以前被废弃了(http://www.python.org/dev/peps/pep-3146/#pep-withdrawal),虽然他们的一些工作仍然存在于CPython和在其他地方,他们的JIT编译器已经死了(并且开始时从未运行良好).我看到有多个实现**作为一般的优势**,尽管关于嵌入的观点是一个好的. (7认同)
  • @NoctisSkytower大多数JVM包含一个JIT编译器,它将Java*字节码编译成机器代码*(而AFAIK Jython生成JVM字节码).CPython和PyPy确实在运行它之前将Python代码编译为它们自己的内部字节码.但这并不能使它们成为通常意义上的JIT编译器(包括编译到本机代码输出,以及与运行时的其他部分紧密集成,如果有的话). (3认同)
  • @delnan感谢您的澄清!有趣的是,发现实际上有多个级别的编译.`源代码 - >字节代码 - >本机代码`然后微处理器将其解释为微代码... (2认同)
  • 我对 python 中的编辑距离进行了相对简单的修改。该例程被多次调用,因此我用 C 语言重新实现了它,但使用了 python 存储类型,并且没有进行任何类型的优化。所以它基本上是相同的代码。执行时间从 5s 下降到 200ms。CPython 在运行 CPU 密集型操作方面做得很糟糕。如果 CPU 和 RAM 是执行时间缓慢的原因,则编译而不是解释总是会带来显着的加速。JIT 是一种在许多场景中提高性能而又不影响程序员便利性的方法。 (2认同)

Ngu*_*aga 14

唯一具有JIT的Python实现是PyPy.Byt - PyPy是Python 2实现,而不是Python 3实现.您可以支持Python 3端口.

  • Python 3.2现在或多或少地支持Python 3 (4认同)

rub*_*bik 8

Numba项目应该适用于Python 3.虽然它不是你提出的问题,但你可能想尝试一下:https: //github.com/numba/numba/blob/master/docs/source/doc/userguide .rst.

它目前不支持所有Python语法.


lol*_*pop 5

您可以尝试pypy py3分支,该分支或多或少与 python兼容,但是官方的CPython实现没有JIT。