尽管JVM的进步,为什么Jython比CPython慢​​得多?

san*_*san 37 python jvm jython

请不要发生火焰战争.我确实不是Java的粉丝,但我认为JVM是一个相当不错且优化得很好的虚拟机.它支持JIT,非常接近流行的CPU架构的共同点.我假设CPython运行时比相应的基于JVM的运行时更远离金属.

如果我的假设是正确的,那么有人可以向我解释为什么Jython与CPython相比会遭受如此重大的性能损失吗?我最初的假设是JVM只是为静态语言设计的,而且很难将动态语言移植到它上面.然而,Clojure似乎是这一论点的一个反例.

另一方面,IronPython似乎做得很好.我相信这两个项目的主要开发人员是相同的,所以一个代码设计和实现明显优于另一个的论点似乎不太可能.

我无法弄清楚具体原因是什么; 任何帮助将不胜感激.

nco*_*lan 21

请记住,IronPython是由一个最初的Jython开发人员(Jim Huginin)创建的,目的是为了证明.NET CLR是动态语言的糟糕平台.他最终证明自己错了,IronPython的核心最终成为.NET动态语言运行时(在.NET上进行其他动态语言实现,比如IronRuby,更容易构建).

所以那里有两个主要的不同点:

  • 最初的.NET CLR开发人员受益于相对于早期版本的JVM的额外行业VM经验,允许他们避免已知问题而无需向后兼容性问题
  • 这同样适用于Jim根据他的Jython经验知道要避免什么陷阱

相对于CPython和IronPython而言,简单地缺少专门用于Jython的开发资源,以及Jython开发优先级,专注于将其与最新版本的Python进行功能奇偶校验,而不是速度优化,并且Jython在它的时候会滞后是可以理解的加快了速度.

也就是说,Jython类似于CPython和IronPython,因为使用更好的算法通常胜过微基准测试中较差的性能.JVM/CLR还意味着,为特定组件下降到Java或C#比下降到CPython的C扩展更容易(尽管像Cython这样的工具尝试稍微缩小这个差距).

  • 我去年在PyconAU的IronPython主题演讲中的理解是IronPython的第一个版本是直接在CLR上编写的.然而,他们随后意识到大部分代码实际上是语言中立的,因此他们将该部分分离到DLR中,IronPython(以及IronRuby等类似工具)现在被实现为相对较薄的语法层而不是普通的动态核心. (2认同)