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

时间:2012-10-23 16:21:56

标签: python python-3.x jit

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

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

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

7 个答案:

答案 0 :(得分:58)

首先,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)项目。但那些目前处于研究或实验阶段,尚未显示其有效性(和成熟度)w.r.t.真实的代码。

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

答案 1 :(得分:14)

唯一具有JIT的Python实现是PyPy。 Byt - PyPy是Python 2实现,而不是Python 3实现。你可以support the Python 3 port

答案 2 :(得分:7)

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

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

答案 3 :(得分:4)

您可以尝试pypy py3 branchmore or less python兼容,但官方的CPython实现没有JIT。

答案 4 :(得分:3)

本网站上一些非凡的Python开发人员最好回答这个问题。

我仍然想评论:在讨论解释语言的速度时,我只想指出在this location: Computer Language Benchmarks Game

主持的项目

这是一个致力于运行基准测试的网站。有指定的任务要做。任何人都可以用他/她的首选语言提交解决方案,然后测试比较每个解决方案的运行时间。解决方案可以经过同行评审,通常可以由其他人进一步改进,并根据规范检查结果。从长远来看,这是比较不同语言的最公平的基准测试系统。

indicative summaries like this one可以看出,与解释语言相比,编译语言非常快。然而,差异可能与编译的确切类型不同,事实上Python(以及图中的其他部分比python慢​​)是完全动态的。可以动态修改对象。类型可以动态修改。因此,某些类型检查必须延迟到运行时,而不是编译时。

因此,虽然您可以争论编译器的好处,但您必须考虑到不同语言中存在不同的功能。而这些功能可能会以固有的价格出现。

最后,在谈论速度时:通常情况并非语言和导致问题的语言感知缓慢,这是一个糟糕的算法。我从来没有必要切换语言,因为一个太慢:当我的代码中出现速度问题时,我修复了算法。但是,如果代码中存在耗时的计算密集型循环,则 通常值得重新编译。一个突出的例子是脚本语言使用的C编码的库(Perl XS库,或者例如Python的numpy / scipy,lapack / blas是可用于许多脚本语言的绑定的库的示例)

答案 5 :(得分:1)

如果你的意思是JIT,就像在及时编译器中使用字节码表示那么它具有这样一个特征(从2.2开始)。如果你的意思是JIT来加工代码,那么没有。然而,编译为字节代码提供了很多性能改进。如果您希望它编译为机器代码,那么Pypy就是您正在寻找的实现。

注意:pypy不适用于Python 3.x

答案 6 :(得分:0)

如果您正在寻找代码块中的速度提升,那么您可能需要查看使用pypy编译为C的rpythonic。它使用装饰器在JIT for Python中转换它。