这个python代码有什么问题,为什么它比ruby运行得那么慢?

时间:2010-10-28 19:29:56

标签: python ruby performance fibonacci

我有兴趣比较ruby speed和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

这笔交易是什么?

5 个答案:

答案 0 :(得分:7)

python的递归效率是造成这种开销的原因。有关更多详细信息,请参阅this article。上面解决这个迭代的解决方案对于python更好,因为它们不会引起函数调用开销递归。我对ruby的假设是,它显然是优化代码而python不是。同样,该文章使用几乎相同的fib函数详细介绍了这一点。

答案 1 :(得分:2)

因此对于这段代码,Python比Ruby快两倍多。可能对于其他代码,Python将比Ruby更快。

您的fib()实现具有指数运行时间。通过使用循环可以很容易地避免这种情况。 Python示例:

a, b = 1, 1
for i in range(35):
    a, b = b, a+b
print b

答案 2 :(得分:2)

计算斐波纳契序列中前35个数字的方法非常低效。你运行一个函数fib()35次,每次fib()都有指数运行时间。 Python中的生成器是解决这个问题的完美解决方案,并且比你在Ruby中编写的更有效。

def fibo_generator(n):
    # gets Fibonacci numbers up to nth number using a generator
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

然后,您可以使用以下代码打印所有斐波纳契数字,最多35个:

for f in fibo_generator(35):
    print f

这是迄今为止在Python中实现斐波纳契数列的最有效方法,也是最通用的方法。

答案 3 :(得分:2)

  

我有兴趣比较红宝石   速度与蟒蛇

微量标记是比较语言的一种非常糟糕的方式,特别是在你掌握两者之前。如果你想要一个具有任何现实意义的基准,那么你需要付出很多努力 - 或者你google for "language shootout"

以下是Python and Ruby

的更好比较

答案 4 :(得分:2)

这里有一些比较的数字:

Python2.7
9.67 user 0.09 system 0:09.78 elapsed 99%CPU (0avgtext+0avgdata 16560maxresident)k
0inputs+0outputs (0major+1169minor)pagefaults 0swaps

ruby 1.8.7 (2010-06-23 patchlevel 299) [x86_64-linux]
28.37 user 0.35 system 0:28.78 elapsed 99% CPU (0avgtext+0avgdata 9200maxresident)k
1896inputs+0outputs (9major+656minor)pagefaults 0swaps

ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]
6.21 user 0.08 system 0:06.36 elapsed 98% CPU (0avgtext+0avgdata 14160maxresident)k
4416inputs+0outputs (16major+953minor)pagefaults 0swaps

Python比ruby1.8快三倍 ,并且对于提供的代码,比ruby1.9.1慢30%。

用于比较的其他Python版本:

2.4.6 took 10.30 seconds

2.5.5 took 9.93 seconds

2.6.6 took 9.22 seconds

2.7   took 9.35 seconds

3.0.1 took 11.67 seconds

3.1.2 took 11.35 seconds

3.2a3+ (py3k:85895, Oct 29 2010, 01:41:57) 
[GCC 4.4.5] took 13.09 seconds

2.5.2 (77963, Oct 15 2010, 02:00:43)
[PyPy 1.3.0] took 21.26 seconds

2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54) 
[OpenJDK 64-Bit Server VM (Sun Microsystems Inc.)] took 8.81 seconds