私はn
以下even
フィボナッチ数の遅延シーケンスの合計を返すClojureのプログラムを持っている:なぜこのレイジーシーケンスを減らすと、このClojureプログラム20xが遅くなるのですか?
(defn sum-of-even-fibonaccis-below-1 [n]
(defn fib [a b] (lazy-seq (cons a (fib b (+ b a)))))
(reduce + (take-while (partial >= n) (take-nth 3 (fib 0 1)))))
(time (dotimes [n 1000] (sum-of-even-fibonaccis-below-1 4000000))) ;; => "Elapsed time: 98.764msecs"
それは非常に効率的ではありません。
(defn sum-of-even-fibonaccis-below-2 [n]
(defn fib [a b] (lazy-seq (cons a (fib b (+ b a)))))
(take-while (partial >= n) (take-nth 3 (fib 0 1))))
(time (dotimes [n 1000] (sum-of-even-fibonaccis-below-2 4000000))) ;; => "Elapsed time: 5.145msecs"
はなぜ、この怠惰なフィボナッチ数列にreduce
とても高価であり、そして私はどのように高速化することができます:私はシーケンスを削減し、単に値(0 2 8 34 144...)
のリストが返されない場合しかし、それは20倍の高速化にその仕事をすることができますそれは慣用的なClojureを放棄しないで?
私はあなたの答えによって混乱しています。 '-1'メソッドは遅いです。マシンで8.5msecで実行するにはどうしましたか?単に高速のマシンですか?おそらく、 – alt
あなたは 'dorun'で2番目のテストを実行しようとしましたか?結果は何でしたか? –
ETA:dorunを追加すると、90msecsに戻ります。 – alt