为什么JIT编译的Python实现仍然很慢?
我明白为什么解释执行会很耗费资源,但我还是想知道,为什么像Psyco和PyPy这样的JIT编译的Python实现,速度还是比C#和Java这些其他JIT编译语言慢这么多呢?
补充一下:我也知道在Python中一切都是对象,动态类型会带来额外的开销等等。不过,对于那些类型可以推断出来的函数,我不太明白这为什么会影响速度。
7 个回答
Python是一种动态语言。
这意味着,其他一些静态语言(比如C#和Java)在编译时完成的很多工作,Python是在运行时完成的,这样会导致性能下降。
编辑:
此外,像Python这样的动态语言的即时编译器(JIT)对代码的优化能力要差很多,因为它无法做出很多假设,这主要是因为代码的动态特性。
举个例子:
动态类型让我们无法对字段、变量或参数的类型做出假设,因此任何涉及这些的优化几乎是不可能的。
编辑2:
只是做个说明:
当我说编译时,我也指的是即时编译时,因为实际上JIT也是一种编译器。
把这个应用到我第一句话上,就意味着Python在JIT时能做的工作远远少于C#或Java……
大家已经提到了一些技术细节,我想再补充一个因素:钱。
在过去的几年里,JavaScript的虚拟机(比如谷歌的V8、Mozilla的Tracemonkey和Jaegermonkey、苹果的Nitro)让另一个动态语言的速度提升了很多。这主要是因为谷歌希望让网页应用更强大。而Python没有一个大公司在推动它变得快50倍,这样的动力就不够了。
哦,还有,Python可以和像numpy这样的C扩展结合使用,这意味着在很多情况下,Python代码的速度并不是特别关键。
最简单的回答就是,PyPy目前的速度还没有HotSpot快,而Psyco永远也不会快。
写一个合理的即时编译器(JIT)是一个漫长而繁琐的过程,比如HotSpot花了很多年才发展到现在这个水平,而且背后还有很多资金支持。语言越复杂、越动态,开发的时间就越长。不过好消息是,我们有一些很好的例子,证明动态语言的即时编译器可以非常快,比如LuaJIT,在很多情况下它的速度甚至能超过C语言或Java虚拟机。
不过也有好消息:根据速度中心的数据,PyPy在过去的100个版本中平均速度提高了27%,所以它最终会变得更快的。