我有興趣比較ruby速度與python,所以我採取了最簡單的遞歸計算,即打印fibonacci sequance。這個python代碼有什麼問題,爲什麼它比ruby運行速度慢?
這是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
這裏是Ruby代碼
#!/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
這就是紅寶石,現在python2 .7給出
real 0m11.605s
user 0m11.563s
sys 0m0.013s
這是怎麼回事?
我只是想指出的是,迭代計算,這將是一個獨立於語言的感覺快很多。在這裏使用遞歸會導致一次又一次地計算相同的值。 – 2010-10-28 19:32:54
我不會列出答案,因爲我不知道確切的原因,但它可能是ruby編譯器有一些優化,Python不支持。天真的fib函數使用遞歸創建了一些語言無法很好處理的巨大調用堆棧。特別是,該語言通常必須實現tail-call遞歸優化,以便在更大的遞歸量下正常處理這種情況並且不會發生堆棧溢出。 – CodexArcanum 2010-10-28 19:34:46
我同意CodexArcanum。這可能是密切相關:http://stackoverflow.com/questions/824562/does-ruby-perform-tail-call-optimization – duffymo 2010-10-28 19:36:45