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

dsi*_*cha 15 c# python java performance jit

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

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

fij*_*jal 11

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

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

然而有好消息:根据速度中心, PyPy在过去100次修订中的平均速度提高了27%,所以它最终会发生.

  • 无论如何,这将是解除公牛的方式:-)我没有说的是我们有很多计划和/或半工作的分支,使事情变得更快. (2认同)

Tho*_*s K 6

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

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

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


dig*_*All 5

Python是一种动态语言.

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

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

例如,
动态类型可以防止关于字段/变量/参数类型的假设......因此任何涉及这种情况的优化几乎是不可能的.

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