【发布时间】:2011-05-02 02:00:29
【问题描述】:
我对比较 ruby 和 python 的速度很感兴趣,所以我采用了最简单的递归计算,即打印斐波那契数列。
这是python代码
#!/usr/bin/python2.7
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1)+fib(n-2)
i = 0
while i < 35:
print fib(i)
i = i + 1
这是红宝石代码
#!/usr/bin/ruby
def fib(n)
if n == 0
return 0
elsif n == 1
return 1
else
fib(n-1)+fib(n-2)
end
end
i = 0
while (i < 35)
puts fib(i)
i = i + 1
end
经过多次运行,时间报告了这个平均值
real 0m4.782s
user 0m4.763s
sys 0m0.010s
这就是 ruby,现在 python2.7 给了
real 0m11.605s
user 0m11.563s
sys 0m0.013s
怎么了?
【问题讨论】:
-
我只想指出,在独立于语言的意义上,迭代计算会快得多。在这里使用递归会导致重复计算相同的值。
-
我不会列出答案,因为我不知道确切的原因,但它可能是 ruby 编译器有一些 Python 没有的优化。使用递归的幼稚 fib 函数会创建一些语言无法很好处理的巨大调用堆栈。特别是,该语言通常必须实现尾调用递归优化,以高效地处理此类情况,并且在大量递归下不会出现堆栈溢出。
-
我同意 CodexArcanum。这可能是密切相关的:stackoverflow.com/questions/824562/…
-
@Codex:这里没有什么可以进行尾调用优化的。该定义不是尾递归的。
-
为什么要循环播放?
fibo = lambda n: int((((1 + math.sqrt(5)) / 2)**n + (1/((1 + math.sqrt(5)) / 2))**n) / math.sqrt(5) + 0.5)
标签: python ruby performance fibonacci