5

私は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

どうしたんだ?

4

5 に答える 5

8

Pythonの再帰効率が、このオーバーヘッドの原因です。詳細については、この記事を参照してください。これを繰り返し解決する上記のソリューションは、関数呼び出しのオーバーヘッド再帰が発生しないため、Pythonに適しています。rubyについての私の仮定は、Pythonがそうではないのに、コードを明らかに最適化しているということです。繰り返しになりますが、この記事では、ほぼ同じfib関数を使用してこれについて詳しく説明しています。

于 2010-10-28T22:32:29.620 に答える
2

Rubyの速度とPythonの比較に興味がありました

マイクロベンチマークは、特に両方を習得する前に、言語を比較するための非常に悪い方法です。現実世界の意味を持つベンチマークが必要な場合は、それに多くの努力を払う必要があります-または「言語シュートアウト」をグーグルで検索します

これがPythonとRubyのより良い比較です

于 2010-10-28T19:56:19.440 に答える
2

比較する数値は次のとおりです。

Python2.7
9.67ユーザー0.09システム0:09.78経過99%CPU(0avgtext + 0avgdata 16560maxresident)k
0inputs + 0outputs(0major + 1169minor)pagefaults 0swaps

ruby 1.8.7(2010-06-23パッチレベル299)[x86_64-linux]
28.37ユーザー0.35システム0:28.78経過99%CPU(0avgtext + 0avgdata 9200maxresident)k
1896inputs + 0outputs(9major + 656minor)pagefaults 0swaps

ruby 1.9.2p0(2010-08-18リビジョン29036)[x86_64-linux]
6.21ユーザー0.08システム0:06.36経過98%CPU(0avgtext + 0avgdata 14160maxresident)k
4416inputs + 0outputs(16major + 953minor)pagefaults 0swaps

提供されたコードでは、 Pythonはruby1.8より3倍高速で、ruby1.9.1より30%低速です。

比較のための他のPythonバージョン:

2.4.6は10.30秒かかりました

2.5.5は9.93秒かかりました

2.6.6は9.22秒かかりました

2.7は9.35秒かかりました

3.0.1は11.67秒かかりました

3.1.2は11.35秒かかりました

3.2a3 +(py3k:85895、2010年10月29日、01:41:57)
[GCC4.4.5]は13.09秒かかりました

2.5.2(77963、2010年10月15日、02:00:43)
[PyPy1.3.0]は21.26秒かかりました

2.5.1(Release_2_5_1:6813、2009年9月26日、13:47:54)
[OpenJDK 64ビットサーバーVM(Sun Microsystems Inc.)]は8.81秒かかりました
于 2010-10-28T23:00:27.033 に答える
2

したがって、このコードの場合、PythonはRubyよりも2倍以上遅くなります。おそらく他のコードの場合、PythonはRubyよりも高速になります。

fib()の実装には、指数関数的な実行時間があります。これは、ループを使用することで簡単に回避できます。Pythonの例:

a, b = 1, 1
for i in range(35):
    a, b = b, a+b
print b
于 2010-10-28T19:35:23.480 に答える
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でフィボナッチ数列を実装するための最も効率的な方法であり、最も用途が広い方法です。

于 2010-10-28T19:49:04.250 に答える