我有兴趣比较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
这笔交易是什么?
答案 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"
的更好比较答案 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