为什么Python比Ruby更快?

时间:2010-07-15 04:56:30

标签: python ruby performance programming-languages

他们似乎有很多相同的特性,但就我所知,Python 2.5的速度远远超过1.8.7。

这背后有更深层次的原因吗?

6 个答案:

答案 0 :(得分:24)

没有,我很确定 - 这完全取决于实施选择和成熟度。毕竟不久前,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的“官方”Mac版本({{1}中每个x的最新版本系列)。我没有2.3可以检查,但我希望它比2.4慢一点。

这只是加速,在许多相同的底层架构的连续版本中可以实现许多热爱,艰苦的工作。不像添加feechurz那样华而不实,但在现实世界中通常更有用! - )

因此,我很确定Ruby还可以稳定在一个声音良好,性能稳健的底层架构上,然后开始在多年来获得稳定的底层性能调整以获得(例如)40我们在这里观察到的进一步改进在过去几年中已经发生在(至少某些部分)Python中。

答案 1 :(得分:21)

一个原因是Python被编译成字节码,然后由高度优化的VM执行。 AFAIK Ruby在1.8及更早版本中不会以这种方式工作 - 但是可以动态地解释树。

这样想:

的Python:

  1. 将代码解析为AST
  2. 将AST转换为字节码
  3. 在VM上运行字节码
  4. Ruby(1.9之前):

    1. 将代码解析为AST
    2. 通过递归遍历直接解释AST
    3. 没有太多细节,旧Ruby中的第2步有很多重复,因为它必须在每次看到它时“理解”AST(在内部循环中很多)。 Python只“理解”AST一次,然后VM尽可能快地运行字节码(原则上与Java和.NET VM的工作方式没有区别。)

      Ruby 1.9移动到YARV,这也是一种基于VM的方法。 Ruby 1.9 is faster than 1.8。这是一个quote from the creator of YARV,Koichi Sasada:

        

      起初,YARV是简单的堆栈机器   运行伪序列   说明。老翻译   (matzruby)遍历抽象语法   树(AST)天真地。显然是的   慢。 YARV将AST编译为YARV   字节码并运行它。

      值得注意的一点是,Python VM也是基于堆栈的,就像YARV一样。

答案 2 :(得分:6)

因为Ruby 1.8并没有真正考虑到性能,而Python更加优化。特别是,Ruby 1.8做了真正的解释,而不是像大多数语言一样编译虚拟机。 Ruby 1.9(使用YARV VM)的速度与Python 3一样快(可能稍微慢一些,但更接近),其他实现甚至更快。

答案 3 :(得分:4)

我阅读了答案,我看到大多数人都在说“哦,你不应该与Ruby 1.8相比,你应该选择1.9,它会更快”。好吧,为什么不看一些基准呢?

以下是Ruby 1.9(YARV)对Ruby 1.8(MRI)的评价: http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=yarv&lang2=ruby

以下是Ruby 1.9与Python 2.x的比较: http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=yarv&lang2=python

总结一下,Ruby 1.9比Ruby 1.8大约快2倍 - 但仍然 - 比Python慢​​2倍。


PS。我想在Chuck的反对意见之后我需要澄清:我没有看到计算机语言枪战作为Life, the Universe and Everything问题的明确答案。离得很远。我很乐意被提到其他客观来源。

我很高兴听到人们在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 - 我们俩不能依赖公正的意见): - )

答案 4 :(得分:0)

更多人一直致力于Python开发,因此已经进行了更多优化。这些语言同样具有灵活性和表现力,因此它们的性能应该收敛,因为两者都使用了所有优秀的优化思想。如上所述,Ruby 1.9大大缩小了Python的性能差距。

答案 5 :(得分:0)

这取决于实现。 Crystal 基本上是 C 编译的 Ruby,甚至可以调用 C 库。然后你在 Beam 端也有 Elixir,不要忘记 Java 和 C# 对应物。但是是的,事实上的标准 Ruby 确实比 Python 慢,而且也是针对 Web 开发的。