为什么这个Fibonacci在Python中的评估要比Haskell快得多

Mik*_*lla 2 python haskell

我有一个计算第n个Fibonacci数的算法,在Python中它表示为:

def fib(n):
    if n == 0:
        return 1
    if n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
Run Code Online (Sandbox Code Playgroud)

在哈斯克尔:

fib :: Integer -> Integer
fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
Run Code Online (Sandbox Code Playgroud)

我希望Haskell能够更快地或大约在同一时间进行评估,但是如果使用上面的数字说n = 40,python代码会更快地评估(~x3).我正在使用GHCi和Ipython,但我认为这不应该有所作为.

sep*_*p2k 19

你说你在GHCI中运行了Haskell代码,这意味着你在没有优化的情况下运行它.这意味着没有进行严格的分析,因此整个事情被懒惰地评估,产生了许多不必要的thunk.这可以解释为什么它变慢了.

正如delnan在评论中指出的那样,ghci比用ghc编译代码然后运行它要慢得多 - 即使没有优化也是如此.当我在我的PC上测试你的代码时,在没有优化的情况下编译后运行所需的时间是优化的两倍,但是运行Python代码的时间仍然少.在ghci中运行需要比这更长的时间.

  • @MikeVella正如我所说的那样,它会产生很多砰砰声.基本上,在情况下,懒惰的评价不会导致渐近更好的运行时(因为不必评估一切),它总是导致与较差的持续性因素运行时,如果它没有被优化掉. (3认同)