为什么IronPython比官方Python解释器更快

15

3
我不确定cPython是否比Jython或IronPython更官方。请参阅http://docs.python.org/reference/introduction.html#alternate-implementations。 - S.Lott
@S.Lott:它不是“the” Python,但仅仅因为它是第一个存在的实现,所以它成为了默认的实现。 - Joachim Sauer
4
Python不会被编译成C。 - Ed S.
抱歉,正如Cody已经指出的那样。 - Ed S.
根据这个链接 http://smallshire.org.uk/sufficientlysmall/2009/05/17/the-performance-of-python-jython-and-ironpython/,它并不是。 - Aleksandr Dubinsky
IronPython没有全局解释器锁(GIL),因此多线程代码应该更快。https://wiki.python.org/moin/IronPython - MichaelMoser
5个回答

41

Python代码不会被编译为C语言,Python本身是用C语言编写的,并解释Python字节码。而CIL会被编译成机器码,这就是为什么使用IronPython时可以获得更好的性能。


1
不过有一个小问题。我同意IronPython为什么更快,但是在启动时间方面IronPython较慢。(如果您经常使用代码,则这并不重要。) - ozgur

9
您说得对,C语言确实更快。这就是为什么在那些与C语言几乎完全相关的字典操作中,CPython执行速度要比Python快两倍的原因。但是另一方面,Python代码不是编译的,而是解释执行的。在CPython中,函数调用非常缓慢。
TryRaiseExcept:  +4478.9%

现在,这就是IronPython出现问题的地方。

而且,还有一个名为PyPy的项目,其目标之一是即时编译器。甚至有一个名为RPython(Reduced Python)的Python子集可以进行静态编译。这当然会快很多


我一直很好奇为什么RPython没有被更多地推广。它足够动态,非常快速,很有用。如果有更多的文档支持,我一定会使用它。 - Daishiman
7
PyPy团队并不希望鼓励人们使用RPython。他们认为这是PyPy的一个实现细节——它经常改变,文档质量差,错误报告也糟糕。他们正在专注于使PyPy JIT足够快,以至于您不需要使用RPython来获得速度... - fuzzyman
RPython并不是开发人员需要使用或关心的。它只是PyPy使用的一个子集来进行编译。如果我的理解没有错的话,你的代码的一部分将被编译,而另一部分仍将被解释执行。 - ozgur

5
漫游你的问题“为什么?”,到“哦,真的吗?”“擅长不同的事情”(Jason Baker)是正确的。例如,与IronPython相比,cpython在启动时间上占据了绝对优势。
c:\Python26\python.exe Hello.py
c:\IronPython\ipy.exe Hello.py

Cpython执行一个基本的hello world几乎瞬间完成(<100ms),而IronPython的启动开销为4或5秒。这让我感到很烦,但还不足以阻止我使用IronPython。


7
CPython与IronPython相比,并不能在自身获取优势。4或5秒是CLR启动时间,而不是IronPython的启动时间。 - Rafa Castaneda
2
启动时多花4或5秒钟并不重要,因为一旦运行起来就会更快(部分原因是CLR),但启动速度较慢(部分原因也是CLR)。性能考虑取决于用户影响的重要性。如果脚本语言的使用情况是许多小脚本,则这是一个严重的缺点。 - Precipitous
2
也许可以通过一次性操作为IronPython .dll预生成机器代码来减少启动时间?请参阅微软的Ngen.exe(本地映像生成器)http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx - ToolmakerSteve
正如其他地方所指出的那样,Mono具有Ahead Of Time complilation(AOT)的概念,该概念在其文档页面上进行了解释。这将减少启动时间和运行时间,但仅限于某些处理器(常见的处理器)。 - dirkjot

5
我不确定你是如何得出IronPython比CPython更快的结论。你发的链接似乎表明它们擅长不同的事情(就像已经指出的异常处理)。

4
这个页面上的符号是否可以解释这个问题:
由于动态语言运行时的站点缓存,与默认值相比,IronPython在执行更多的PyStone传递时表现更好。

不了解网站缓存是什么(这是一个非常复杂的概念,只有在Channel9的视频系列中才能真正解释清楚),这并不能告诉你什么。此外,IPy1(早期的DLR)的性能也比CPython更好。这一切都归结于CIL编译。 - Serafina Brocious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接