为什么JITted Python实现仍然很慢?

时间:2010-12-21 14:20:14

标签: c# java python performance jit

我理解为什么解释开销很昂贵,但为什么JITted Python实现(Psyco和PyPy)仍然比C#和Java等其他JITted语言慢得多?

编辑:我也明白一切都是对象,动态打字很昂贵等等。但是,对于可以推断出类型的函数,我不确定为什么这很重要。

7 个答案:

答案 0 :(得分:11)

最简单的答案是,PyPy还没有热点那么快,Psyco永远不会。

编写一个合理的JIT是一个漫长而乏味的过程,例如,热点需要多年时间才能获得它(也需要大量资金)。语言越复杂,越动态,所需的时间就越长。从好的方面来说,我们有很好的例子说明动态语言的JIT如何非常快,将LuaJIT作为一个,在很多例子中可以胜过C或JVM。

然而有好消息:根据speed center PyPy在过去的100次修订中平均快了27%,所以它最终会发生。

答案 1 :(得分:6)

人们已经指出了技术细节,所以我将添加另一个因素:钱。

在过去几年中,Javascript VMs(谷歌的V8,Mozilla的Tracemonkey和Jaegermonkey,Apple的Nitro)为另一种动态语言带来了巨大的速度提升。这主要是因为谷歌希望让网络应用更加强大。 Python只是没有一家大公司可以通过提高50倍来获得收益。

哦,与Numpy等C扩展的集成意味着速度对于Python代码来说很少是至关重要的。

答案 2 :(得分:5)

Python是dynamic language

这意味着其他静态语言(如C#和Java)在编译时所做的大部分工作都是在运行时完成的,这会降低性能。

修改
此外,像python这样的动态语言的JIT编译器可以对代码执行更少的优化,因为由于代码的动态性,它不能做很多假设。

<强> e.g。
动态类型可以防止对字段/变量/参数类型的假设...因此,任何涉及此的优化几乎都是不可能的。

<强> EDIT2:
只是一个澄清:
当我说编译时,我的意思是JIT编译时,因为实际上JIT是一个编译器 将此应用于我的第一句话,使得Python可以在JIT时间执行的工作少于C#或Java ......

答案 3 :(得分:1)

一个非常好的问题。我不能给你一个完整的答案,但我认为其中一个原因是“一切都是对象而一个对象可能是任何东西”的概念。在Java中,如果你尝试“1.getClass()”,它将无法工作,除非你首先明确或隐式地将其打包。在Python中,它开箱即用。但是对象肯定比原始类型更重要,Python似乎没有。

“一个对象可以是任何东西”部分更为重要。如果你在Java中编写“someobject.somefield”,它在编译时知道究竟什么是“somefield”并生成直接访问它的代码。好吧,可能有一些技巧可以提供更好的二进制兼容性,但这与Python不同,它实际上在运行时执行某种字典查找,以确定在该特定时刻究竟是什么“somefield”,因为字段可以可以动态添加和删除。

简而言之,Python功能更强大,但这种功能有其成本。

答案 4 :(得分:1)

您无法将动态语言与企业级静态语言进行比较。 Sun花了很多钱来优化语言,VM和JIT。微软在他们的虚拟机上也做得很好。

比较jit的动态语言更有趣。关于JavaScript的问题是让谷歌让他们的V8比PyPyruby 1.9更快,或者只是投入了多少钱?

答案 5 :(得分:0)

  

我明白为什么解释   开销很贵......

比较这些Python实现to non-JIT interpreted-mode Java并再次考虑您的问题。

答案 6 :(得分:0)

整个问题在2014年不再那么清楚了。谷歌的V8 JS引擎做了一些相当重的事情来优化js的地狱。

如果只有足够的资金,PyPy可能会快得多。 Python的执行速度大多无关紧要,因此没有人在PyPy中投入大量资金。

这不再是技术问题了。查看Java的InvokeDynamic指令。当然,这些调用在第一次被调用时花费更多,但是一旦这些调用开始启动,JVM就可以做出神奇的事情。那就是:JVM可以做假设,并且可以在运行时了解代码。如果方法始终返回int,则此方法可能始终返回int。实际上,JVM做得更多。

2014年,在性能方面,它实际上并非动态与静态。 Sure C ++将永远是最快的工具,但是动态语言并不像几年前那样“放大”。

再等几年,我打赌2016年或2017年静态分析会更加强大。现在有一些非常有趣的研究项目正在运行。

理论上: 您基本上可以使用静态类型分析来推断每种类型,您必须先了解代码在执行之前所做的 。这不是不可能的。

静态分析变得更强大时,您实际上不再需要静态类型系统了。所有静态类型系统,甚至是haskell,都限制了正确程序的数量。所以从本质上讲:如果你有一个可以通过分析来证明程序正确性的分析器,那么它作为一个只能在边界内起作用的静态类型系统会更加强大。关于代码重用:没有什么可以打败动态类型。

有一些人会说动态类型对大型应用程序不利,但如果静态分析变得更强大,那么实际上您将拥有与静态类型系统相同或可能更加经过验证的正确性可以提供。当然,静态类型语言也可以静态分析,但静态类型系统是无用的。

所以从本质上讲:我知道,这里有很多if。但是10年前,如果你告诉他们js变得如此之快,以至于你可以轻松地在其中编写重型3d opengl应用程序,人们会笑的。

永远不要低估未来。