为什么Jython比CPython慢得多,尽管有JVM';什么是预付款?

为什么Jython比CPython慢得多,尽管有JVM';什么是预付款?,python,jvm,jython,Python,Jvm,Jython,请不要火战。诚然,我不喜欢java,但我认为JVM是一个相当不错的优化的虚拟机。它支持JIT,非常接近流行CPU体系结构的公分母。我假设CPython运行时比相应的基于JVM的运行时离金属更远 如果我的假设是正确的,有人能向我解释为什么Jython在性能上比CPython遭受如此大的损失吗?我最初的假设是JVM只是为静态语言设计的,很难将动态语言移植到JVM中。然而,Clojure似乎是这一观点的反例 另一方面,IronPython似乎做得很好。我相信这两个项目的首席开发人员是相同的,所以认为其

请不要火战。诚然,我不喜欢java,但我认为JVM是一个相当不错的优化的虚拟机。它支持JIT,非常接近流行CPU体系结构的公分母。我假设CPython运行时比相应的基于JVM的运行时离金属更远

如果我的假设是正确的,有人能向我解释为什么Jython在性能上比CPython遭受如此大的损失吗?我最初的假设是JVM只是为静态语言设计的,很难将动态语言移植到JVM中。然而,Clojure似乎是这一观点的反例

另一方面,IronPython似乎做得很好。我相信这两个项目的首席开发人员是相同的,所以认为其中一个项目的代码设计和实现明显优于另一个项目的说法似乎不太可能


我不知道确切的原因是什么;任何帮助都将不胜感激。

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

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

  • 与早期版本的JVM相比,原始的.NET CLR开发人员受益于更多的行业VM经验,使他们能够避免已知的问题,而不必考虑向后兼容性问题
  • 同样的道理也适用于吉姆,根据他的Jython经验,他知道应该避免什么陷阱
再加上相对于CPython和IronPython而言,Jython缺乏专门的开发资源,而Jython的开发重点是将其功能提升到与Python最新版本相当的水平,而不是速度优化,因此Jython在速度方面会落后是可以理解的


这就是说,Jython与CPython和IronPython都很相似,因为在微基准测试中,使用更好的算法往往胜过性能较差的算法。JVM/CLR还意味着,对于特定组件,使用Java或C#比使用CPython的C扩展更容易(尽管Cython等工具试图缩小这一差距)。

此外,请包含指向测量的链接,以显示其实际速度有多慢,在哪些方面.jython比cpython更快,比如
gcd()
我实际上更想看到jython在JDK7“无火焰战争”中使用invokedynamic。。。而且没有实际的硬数字。矛盾如果你想避免火焰之战,请在你的问题中加入真实的测量值。这似乎是合理的,我希望从jython那里学到的经验可以转化为IronPython。Ironpython运行在DLR而不是CLR上,前者的原语更适合于动态语言。我从去年PyconAU的Ironpython主题演讲中了解到,Ironpython的第一个版本是直接在CLR上编写的。然而,他们随后意识到,大部分代码实际上与语言无关,因此他们将这部分代码分离到DLR中,IronPython(以及类似的工具,如IronRuby)现在被实现为公共动态核心上相对较薄的语法层。感谢您的解释。是否正确理解了您的评论,即DLR是CLR之上的动态层,并且大量DLR代码实际上在下面调用CLR。想知道这一点,因为在这种情况下,可能也可以(原则上)为JVM编写这样一个层。但如果DLR改变了CLR的内部结构,那么这个类比就不成立了。我一直在讨论这个问题,希望能得到更多关于分歧的细节。在我接受答复之前,我可能会再等几天。我的理解是,DLR是CLR的补充,而不是替代。这就是为什么它可以在动态和静态语言之间实现如此简单的互操作性。