它们似乎具有很多相同的特点,但据我所知,Python 2.5比1.8.7快得多。
这背后是否有更深层次的原因呢?
它们似乎具有很多相同的特点,但据我所知,Python 2.5比1.8.7快得多。
这背后是否有更深层次的原因呢?
并不是什么深奥的问题,我非常确定--这纯粹是一种实现选择和成熟度的问题。毕竟不久以前,Python 在许多方面都慢了很多!例如:
$ py24 -mtimeit '[i+i for i in xrange(55)]'
100000 loops, best of 3: 10.8 usec per loop
$ py25 -mtimeit '[i+i for i in xrange(55)]'
100000 loops, best of 3: 9.83 usec per loop
$ py26 -mtimeit '[i+i for i in xrange(55)]'
100000 loops, best of 3: 8.12 usec per loop
$ py27 -mtimeit '[i+i for i in xrange(55)]'
100000 loops, best of 3: 6.35 usec per loop
是的,所有的东西都在同一台机器上(Macbook Pro,2.4 GHz Intel Core 2 Duo,OSX 10.5),所有版本都是从python.org官方发布的(每个“x”系列中最新的一个版本)。我没有2.3版本来检查,但我认为它应该比2.4版本慢一点。
这就是通过不断优化基本架构以实现连续发布的速度提升。虽然不像添加功能那样引人注目,但在现实世界中通常更加有用!-)
因此,我相信Ruby也可以稳定地运行在一个性能稳健的基础架构上,然后在未来的几年中得到持续的、界面下的性能优化,以获得(例如)我们在Python的至少某些部分中观察到的40%左右的进一步改进。
Python之所以更快,是因为它将代码编译成字节码,然后由高度优化的虚拟机执行。据我所知,Ruby在1.8及以前并不是这样工作的,而是实时解释AST树。
可以这样理解:
Python:
Ruby(1.9之前):
简单说一下,旧版Ruby中的第二步有很多重复操作,因为每次看到AST都必须"理解"一遍(在内部循环中会反复出现)。而Python只需要在一开始就"理解"AST,然后VM就尽可能快地运行字节码(与Java和.NET VM的工作原理基本相同)。
Ruby 1.9使用了YARV,也是一种基于VM的方法。因此Ruby 1.9比1.8更快。以下是YARV的创造者Koichi Sasada的一句话:
起初,YARV是一个简单的栈机器,可以运行伪顺序指令。旧解释器(matzruby)会朴素地遍历抽象语法树(AST)。显然速度很慢。YARV将AST编译成YARV字节码并运行它。
有趣的一点是,Python VM也是基于堆栈的,就像YARV一样。
因为Ruby 1.8在设计时并没有考虑性能问题,而Python更加优化。特别是,Ruby 1.8实际上是进行解释执行,而不像现今大多数语言一样编译成虚拟机代码。Ruby 1.9(使用YARV虚拟机)的速度与Python 3几乎相当(可能略慢一些,但非常接近),而其他实现甚至更快。
PS. 我想在 Chuck 的反对之后澄清一下:我不认为 计算机语言对比 是关于 生命、宇宙和万物的终极答案。远非如此。我很乐意被引用其他客观来源。
我也很乐意听到 S/O 上的人们提供非正式/主观的结果,前提是他们参与了50次以上有关Python或Ruby的讨论,并且他们的Ruby/Python偏见在+/-5dB以内(Ruby/Python比率计算公式为RPR=10*log10(numTags('Ruby')/numTags('Python')) dB;因此对于用户Chuck,这将是10*log10(225/13)=12dB,我的为-10——我们都不能依赖于无偏见的意见):-)
越来越多的人已经从事Python开发多年,因此进行了更多的优化。这些语言同样灵活和表达力强,因此随着所有好的优化思路在两者中得到应用,它们的性能应该会趋于一致。正如上面所提到的,Ruby 1.9大大缩小了与Python之间的性能差距。
这取决于实现方式。Crystal 基本上是将 Ruby 编译成 C,甚至可以调用 C 库。然后你还有 Beam 端的 Elixir,别忘了 Java 和 C# 的对应物。但是没错,Ruby 这个事实标准确实比 Python 慢,也针对网站开发。