这个python代码有什么问题吗,为什么与ruby相比,它运行这么慢?


问题内容

我对比较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

多数民众赞成在红宝石,现在python2.7给

real    0m11.605s
user    0m11.563s
sys     0m0.013s

这是怎么回事?


问题答案:

python的递归效率是造成这种开销的原因。有关更多详细信息,请参见本文。以上迭代解决此问题的解决方案对于python更好,因为它们不会引发函数调用开销递归。我对ruby的假设是,它很明显在优化代码,而python不是。同样,该文章使用几乎相同的fib函数对此进行了详细介绍。