Python 3解释器是否具有JITfunction?

我发现,当我向Python提出更多的要求时,python并没有使用100%的机器资源,而且速度也不是很快,与许多其他解释语言相比,速度很快,但是与编译语言相比,我认为差异真是了不起。

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

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

首先,Python 3(.x)是一种语言,可以有任何数量的实现。 好吧,直到今天,除了CPython,实现都没有实现实现这些语言的版本。 但是这将改变(PyPy正在赶上)。

为了回答你所要问的问题:CPython,3.x或其他,不会,也不可能永远不会包含JIT编译器。 其他一些Python实现(本地PyPy,Jython和IronPython通过为构build的虚拟机重新使用JIT编译器)确实有一个JIT编译器。 当他们添加Python 3支持时,他们的JIT编译器没有任何理由停止工作。

但是,当我在这里,也让我解决一个错误的观念:

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

这是不正确的。 JIT编译器以其最基本的forms,仅仅消除了解释器的开销,这会导致你看到的一些放缓,但是对于大多数来说却不是。 一个好的 JIT编译器还执行一系列优化,从而消除了通常实现大量Python特性所需的开销(通过检测允许更有效实现的特殊情况),突出的例子是dynamictypes,多态性和各种内省function。

只是实现一个编译器没有帮助。 您需要非常聪明的优化,其中大部分只在非常特定的情况下和有限的时间窗口内有效。 JIT编译器在这里很容易,因为它们可以在运行时生成专门的代码(这是它们的全部重点),可以在运行时更容易(更准确地)分析程序,并且可以在优化失效时撤销优化。 与提前编译器不同,它们也可以与解释器交互,而且经常这样做,因为这是一个明智的devise决策。 我想这就是为什么他们和人们心目中的口译员联系在一起,尽pipe他们可以并且确实独立存在。

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

当然,具体程序的性能取决于程序本身,而不是语言实现。 语言实现只能设置一个上限,以便您可以快速完成一系列操作。 一般来说,通过避免不必要的工作,即通过优化程序,您可以更好地提高程序的性能。 无论您是通过解释器,JIT编译器还是提前编译器来运行程序,情况都是如此。 如果你想要一些快速的东西,不要为了获得更快的语言实现而走出困境。 有一些应用程序在解释和dynamic的开销方面是不可行的,但是它们并不像你想象的那么普遍(并且经常通过调用机器代码编译的代码来解决)。

具有JIT的唯一Python实现是PyPy 。 Byt – PyPy是一个Python 2的实现,而不是Python 3的实现。 你可以支持Python 3端口 。

Numba项目应该可以在Python 3上工作。虽然这不是你所要求的,但你可以试试看: https : //github.com/numba/numba/blob/master/docs/source/doc/userguide第一 。

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

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

这个网站上一些非常棒的Python开发人员最好的回答。

不过我想评论一下:在讨论解释型语言的速度时,我只想指向一个在这个位置托pipe的项目:计算机语言基准游戏

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

正如您可以从这样的指示性摘要中看到的,与解释语言相比,编译语言相当快。 然而,差别可能不在于编译的确切types,而是Python(以及图中比python慢​​的其他)完全dynamic的事实。 对象可以随时修改。 types可以随时修改。 所以一些types检查必须延迟到运行时间,而不是编译时间。

所以虽然你可以争论编译器的好处,但你必须考虑到不同的语言有不同的function。 而这些function可能会以固有的价格出现。

最后,在谈论速度的时候:大多数情况下,语言不是一种语言,而是一种语言的迟缓,这是一个糟糕的algorithm。 我从来不必切换语言,因为速度太慢:当我的代码出现速度问题时,我修正了algorithm。 但是,如果代码中存在耗时的计算密集型循环,通常值得重新编译这些循环。 一个突出的例子是用脚本语言编写的用C语言编写的库(Perl XS库,或者Python的numpy / scipy,lapack / blas是可用于许多脚本语言的绑定的libs的例子)

如果你的意思是即时编译到字节码表示,那么它有这样一个function(自2.2)。 如果你的意思是JIT机器码,那么没有。 然而,对字节码的编译提供了很多性能改进。 如果你想把它编译成机器码,那么Pypy就是你正在寻找的实现。

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

如果您正在寻找代码块中的速度改进,那么您可能希望看看rpythonic ,它使用pypy编译到C。 它使用一个装饰器,在Python的JIT中转换它。