为什么Jython比CPython慢,尽管JVM有进步?
请不要争论。我承认我不是Java的粉丝,但我觉得JVM(Java虚拟机)是一个相当不错且优化得很好的虚拟机。它支持即时编译(JIT),而且与常见的CPU架构非常接近。我猜测,CPython的运行环境可能比JVM的运行环境更接近底层硬件。
如果我的猜测是对的,能不能有人解释一下为什么Jython的性能相比CPython会有这么大的差距?我最开始的想法是,JVM是为了静态语言设计的,把动态语言移植到上面会很困难。不过,Clojure似乎是一个反例,说明这个说法并不完全正确。
另一方面,IronPython的表现似乎还不错。我相信这两个项目的主要开发者是同一个人,所以说一个项目的代码设计和实现明显优于另一个项目的说法似乎不太成立。
我搞不清楚具体的原因是什么;任何帮助都会很感激。
1 个回答
要知道,IronPython是由最初的Jython开发者之一(Jim Huginin)开始的,他想证明.NET的CLR(公共语言运行时)并不适合动态语言。结果他发现自己错了,IronPython的核心最终变成了.NET动态语言运行时,这让在.NET上实现其他动态语言(比如IronRuby)变得容易多了。
所以这里有两个主要的不同点:
- 最初的.NET CLR开发者相较于早期的JVM(Java虚拟机),在行业虚拟机方面有更多的经验,这让他们能够避免已知的问题,而不必担心向后兼容性。
- Jim也因为他的Jython经验,知道哪些陷阱要避免。
再加上,相比于CPython和IronPython,Jython在开发资源上的投入较少,而且Jython的开发重点是让它的功能与最新版本的Python保持一致,而不是优化速度,所以Jython在速度上落后也是可以理解的。
不过,Jython在某种程度上与CPython和IronPython是相似的,因为使用更好的算法往往能胜过在微基准测试中的较差性能。JVM和CLR也意味着,对于特定组件,使用Java或C#会比在CPython中使用C扩展更容易(尽管像Cython这样的工具试图缩小这个差距)。