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


71

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

是否可以使用Python 3中的即时(JIT)编译器来加快处理速度?

通常,只有JIT编译器才能提高解释语言的性能,所以我指的是这种方法,如果有其他解决方案可用,我希望接受新的答案。



@rubik谢谢,但是我一直在寻找python 3而不是python 2的解决方案,以及官方解释器的解决方案,而不是其他任何解释器的解决方案。
古斯

1
尽管pypy尚不支持python3。根据您的工作,有各种提高性能的方法-例如,使用更好的算法,使用multiprocssingorthreading模块进行并行化或在C中编写扩展名(可以是使用cython或类似软件简化了操作)。
詹姆斯

Python的大多数实现都不会被解释,而是被编译为字节码。
罗素·博罗戈夫

3
@rubik,很好的建议。我要添加到您的列表中:“使用现有扩展名(例如NumPy)”。
jimhark 2012年

Answers:


70

首先,Python 3(.x)是一种语言,它可以有许多实现。好的,到目前为止,除CPython之外,没有其他实现实际实现这些语言的版本。但这将改变(PyPy正在追赶)。

要回答您要问的问题:CPython(3.x或其他版本)不包含,也从未包含并且可能永远不会包含JIT编译器。其他一些Python实现(本机为PyPy,Jython和IronPython,通过在其构建的虚拟机上重新使用JIT编译器)确实具有JIT编译器。而且,当他们添加Python 3支持时,他们的JIT编译器没有理由停止工作。

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

通常,只有JIT编译器才能提高解释语言的性能

这是不正确的。JIT编译器以其最基本的形式,仅消除了解释器开销,这可以解决您看到的某些速度下降,但不能解决大多数问题。甲良好JIT编译器还执行其删除并实施了许多所需的开销的Python一般特征(通过检测特殊情况下,其允许更有效的实现)的优化,突出实例是动态类型,多态性,以及各种内省特征的主机。

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

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

当然,特定程序的性能对程序本身的依赖远不止于语言实现。语言实现只为您执行一系列操作的速度设置了上限。通常,您可以通过避免不必要的工作(即通过优化程序)来更好地提高程序的性能。不管您是通过解释器,JIT编译器还是提前编译器运行程序,这都是正确的。如果您想让某些事情变得更快,那么请不要全力以赴以获得更快的语言实现。有些应用程序在解释和动态性方面是不可行的,但它们并没有您想像的那么普遍(通常通过有选择地调用由机器代码编译的代码来解决)。


我听说Google对使用3.x版本的JIT更快地制作python感兴趣,所以我一直在寻找答案。使用不同的解释器的问题仅仅是您最终拥有多个实现,而且提供内置python控制台的许多应用程序仅引用了官方python解释器。所以最后没有什么好准备为python 3准备的?
古斯

7
@guz Google的Unladden Swallow项目很久以前就被放弃了,尽管他们的某些工作可以在CPython和其他地方继续进行,但是他们的JIT编译器已死(从一开始就没有很好地工作)。我一般认为将多个实现作为一个优势,尽管关于嵌入的观点是一个很好的观点。

3
@NoctisSkytower大多数JVM包含一个JIT编译器,该编译器将Java字节码编译为机器代码(而AFAIK Jython生成JVM字节码)。CPython和PyPy确实在运行Python之前将其编译为自己的内部字节码。但这并不能使它们成为通常意义上的JIT编译器(包括对本机代码输出的编译,以及与运行时其他部分的紧密集成(如果有))。

2
@delnan感谢您的澄清!有趣的是,发现实际上存在多个编译级别。source code -> byte code -> native code然后微处理器将其解释为微代码...
Noctis Skytower 2012年

1
我对python中的levenshtein距离做了一个相对简单的修改。该例程被称为很多例程,因此我在C中重新实现了该例程,但使用了python存储类型,并且未进行任何优化。因此,它基本上是相同的代码。执行时间从5s减少到200ms。CPython在运行CPU繁重的操作方面做得很糟糕。如果CPU和RAM是执行时间缓慢的原因,那么编译而不是解释总是会大大提高速度。JIT是在很多情况下提高性能的一种方式,而不会给程序员带来便利。
Gellweiler '18年

15

具有JIT的唯一Python实现是PyPy。Byt-PyPy既是Python 2实现又是Python 3实现。


5
现在对Python 3的支持已经或多或少地完善了,直到Python 3.2
naught101 '16

10

Numba项目应该可以在Python 3上运行。尽管它并不是您所要求的,但您可能想尝试一下:https : //github.com/numba/numba/blob/master/docs/source/doc/userguide .rst

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


1
据我所知,Numba并非也不是Python的实现。取而代之的是,它显然是一种看起来像Python的语言的实现,但实际上却并非如此-牺牲了许多语言功能来提高性能。如我错了请纠正我。也许PyPy开发人员洗了我一眼,但我认为这不应与Python(甚至称其为Python)相比,除非声明它与Python完全不同。

@delnan:这很有趣。为什么不使用功能较少的Python呢?我对项目不太了解,但是IIUC您有一个Python文件,然后应用jit装饰器就可以了:)可能这过于乐观和/或幼稚。实际上,我什至没有尝试,尽管我想...
rubik 2012年

因为“功能较少的Python”不是Python,所以这是一种非常不同的语言,也正被Python接受。是的,假设它确实可行太乐观了。除非Numba开发人员一人做PyPy所做的事情,还有很多其他限制,否则将在更少的时间内用更少的人力来完成工作,否则Numba必然只支持Python的一小部分。我想说的最小限制是(隐式,容易推断的)静态类型。如果他们也支持任意用户定义的对象,我会感到惊喜,但我对此表示怀疑。

@delnan:好的,你说服了我!在以后的答案中,我不会将其称为Python!;)
rubik 2012年


3

这个站点上的一些杰出的Python开发人员将最好地回答这一问题。

我还是要发表评论:在讨论解释语言的速度时,我只想指出一个托管在此位置的项目:计算机语言基准游戏

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

从这样的指示性摘要中可以看出,与解释型语言相比,编译后的语言非常快。但是,差异可能在编译的确切类型上并没有那么多,这是Python(以及图中其他比Python慢​​的)是完全动态的事实。可以动态修改对象。类型可以随时修改。因此,必须将某些类型检查推迟到运行时,而不是在编译时进行。

因此,尽管您可以争论编译器的好处,但必须考虑到不同语言具有不同的功能。这些功能可能会以内在的代价来价。

最后,在谈论速度时:造成问题的通常不是语言和语言的缓慢性,而是不好的算法。我从来不需要切换语言,因为它太慢了:当我的代码中出现速度问题时,我会修复算法。然而,如果在你的代码耗时的,计算密集型回路它通常值得的重新编译的。一个著名的例子是脚本语言使用的用C编码的库(Perl XS库,例如Python的numpy / scipy,lapack / blas是可用于许多脚本语言绑定的库的示例)


是的,但是如果我只是从source.py文件运行代码,那么我可能无法利用这种动态性,而且在我从文件运行代码的那一刻起,您就可以确定我的操作系统,平台以及我的程序会这样做,这可能是有用的信息,可以像JIT示例中那样导致优化。
guz 2012年

@igouy:感谢您指出。我已经澄清了我的回应。
cfi 2012年

该项目的名称显示在每个页面的横幅中以及Web浏览器标题栏中,网站上显示的那些段落解释了为什么至少有5年没有将该项目称为“事件”。
igouy 2012年

挑剔 但也许是这样。改名。请对您的批评家保持谨慎:服务器仍被命名为Shootout,并且比我在这里承认的年龄大得多,并且已经习惯了多年。我确实相信名称的更改完全是文字游戏,因为最后才是上下文。如果人们以前不了解跨语言基准测试的优缺点,那么现在他们将不了解。我仍然纠正了这个问题,因为我确实相信言语的魔力,而且我自己也是个顽固的选择者:-)真的,非常感谢您为纠正此问题所做的努力。
cfi 2012年

在Google搜索结果中涉猎色情网站和大学大屠杀对我来说并不是一个美好的开端-因此,在弗吉尼亚理工大学之后,我改了名字。
igouy 2012年

1

如果您将JIT像即时编译器中那样表示为Bytecode表示形式,则它具有这样的功能(自2.2开始)。如果您将JIT表示为机器代码,则不会。然而,编译为字节码可提供许多性能改进。如果您希望将其编译为机器代码,则Pypy是您要寻找的实现。

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


0

如果您希望在代码块中提高速度,那么您可能希望看看rpythonic,它可以使用pypy编译为C。它使用装饰器将其转换为用于Python的JIT。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.