2

n 番目のフィボナッチ数を計算するためのアルゴリズムがあります。Python では次のように表されます。

def fib(n):
    if n == 0:
        return 1
    if n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

そしてHaskellでは:

fib :: Integer -> Integer
fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

私は Haskell がより速く、またはほぼ同時に評価されることを期待していましたが、n=40 などの上記の数値を使用すると、Python コードははるかに (~x3) 速く評価されます。私は GHCi と Ipython を使用していますが、違いがあるとは思いませんでした。

4

2 に答える 2

19

あなたは Haskell コードを GHCI で実行したと言いましたが、これは最適化なしで実行したことを意味します。つまり、厳密性分析が行われていないため、全体が遅延して評価され、多くの不要なサンクが作成されました。それはなぜそれが遅かったのかを説明するでしょう。

また、delnan がコメントで指摘したように、ghci は、コードを ghc でコンパイルしてから実行するよりもはるかに遅くなります (最適化を行わなくても)。あなたのコードを自分の PC でテストすると、最適化なしでコンパイルした後に実行すると、最適化を行った場合の 2 倍の時間がかかりますが、それでも Python コードを実行するよりは短い時間です。ghci で実行すると、それよりもずっと時間がかかります。

于 2013-01-24T22:39:55.130 に答える