我有一个计算第n个Fibonacci数的算法,在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,但我认为这不应该有所作为。
答案 0 :(得分:19)
你说你在GHCI中运行了Haskell代码,这意味着你在没有优化的情况下运行它。这意味着没有进行严格的分析,因此整个事情被懒惰地评估,产生了许多不必要的thunk。这可以解释为什么它变慢了。
正如delnan在评论中指出的那样,ghci比用ghc编译代码然后运行它要慢得多 - 即使没有优化。当我在我的PC上测试你的代码时,在没有优化的情况下编译后运行所需的时间是优化的两倍,但是运行Python代码的时间仍然少。在ghci中运行需要比这更长的时间。
答案 1 :(得分:0)
这是我在haskell示例中看到最多的fib实现:
fib n = fibs!!n
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
尝试它与python代码,它可能会快得多。它不是直接的翻译,但可能更具惯用性。
这不是一个直接的答案,但也许没有人希望有一个优化的fib将使用你在那里使用的天真实现。因此,这不是比较python和haskell性能的最佳方法。
更多关于Fib in haskell