我发现,当我向Python提出更多要求时,python不会100%使用我的机器资源,而且速度不是很快,与许多其他解释型语言相比,它很快,但是与编译语言相比,我认为区别是真的很棒。
是否可以使用Python 3中的即时(JIT)编译器来加快处理速度?
通常,只有JIT编译器才能提高解释语言的性能,所以我指的是这种方法,如果有其他解决方案可用,我希望接受新的答案。
我发现,当我向Python提出更多要求时,python不会100%使用我的机器资源,而且速度不是很快,与许多其他解释型语言相比,它很快,但是与编译语言相比,我认为区别是真的很棒。
是否可以使用Python 3中的即时(JIT)编译器来加快处理速度?
通常,只有JIT编译器才能提高解释语言的性能,所以我指的是这种方法,如果有其他解决方案可用,我希望接受新的答案。
Answers:
首先,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编译器还是提前编译器运行程序,这都是正确的。如果您想让某些事情变得更快,那么请不要全力以赴以获得更快的语言实现。有些应用程序在解释和动态性方面是不可行的,但它们并没有您想像的那么普遍(通常通过有选择地调用由机器代码编译的代码来解决)。
source code -> byte code -> native code
然后微处理器将其解释为微代码...
具有JIT的唯一Python实现是PyPy。Byt-PyPy既是Python 2实现又是Python 3实现。
Numba项目应该可以在Python 3上运行。尽管它并不是您所要求的,但您可能想尝试一下:https : //github.com/numba/numba/blob/master/docs/source/doc/userguide .rst。
目前,它不支持所有Python语法。
这个站点上的一些杰出的Python开发人员将最好地回答这一问题。
我还是要发表评论:在讨论解释语言的速度时,我只想指出一个托管在此位置的项目:计算机语言基准游戏
这是一个专门用于运行基准测试的网站。有指定的任务要做。任何人都可以使用其首选语言提交解决方案,然后测试将比较每个解决方案的运行时间。可以对解决方案进行同行评审,通常可以通过其他解决方案进行进一步改进,然后根据规格检查结果。从长远来看,这是比较不同语言的最公平的基准测试系统。
从这样的指示性摘要中可以看出,与解释型语言相比,编译后的语言非常快。但是,差异可能在编译的确切类型上并没有那么多,这是Python(以及图中其他比Python慢的)是完全动态的事实。可以动态修改对象。类型可以随时修改。因此,必须将某些类型检查推迟到运行时,而不是在编译时进行。
因此,尽管您可以争论编译器的好处,但必须考虑到不同语言具有不同的功能。这些功能可能会以内在的代价来价。
最后,在谈论速度时:造成问题的通常不是语言和语言的缓慢性,而是不好的算法。我从来不需要切换语言,因为它太慢了:当我的代码中出现速度问题时,我会修复算法。然而,如果在你的代码耗时的,计算密集型回路它是通常值得的重新编译的。一个著名的例子是脚本语言使用的用C编码的库(Perl XS库,例如Python的numpy / scipy,lapack / blas是可用于许多脚本语言绑定的库的示例)
如果您希望在代码块中提高速度,那么您可能希望看看rpythonic,它可以使用pypy编译为C。它使用装饰器将其转换为用于Python的JIT。