を減らすねじ切りマップを最適化:それは数字が大きい得るとき、それは時間が爆発を実行していることを除いて、うまく働いているClojureの - 私は次のコードを持っている
(defn series-sum
"Compute a series : (+ 1 1/4 1/7 1/10 1/13 1/16 ...)"
[n]
(->> (iterate (partial + 3) 1)
(map #(/ 1 %))
(take n)
(reduce +)
float
(format "%.2f")
(str)))
を。私のコンピュータで(series-sum 2500)
はおそらく2番目または2つですが、(series-sum 25000)
と私は私のREPLを殺す必要があります。
可能な限り(take n)
を移動しようとしましたが、それでは不十分です。なぜ私はそれが遅くなるのか分からないので、私はClojureについて何かを理解していないと感じている(私は(series-sum 25000)
が(series-sum 2500)
と約10倍かかると思う)。
最適化するための明白なループ/反復解がありますが、ステップを印刷して1つのステップ(ドキュメントストリングのように見える(take n)
)を持つことができるという考えが好きです。
デバッグ性を維持しながらこのコードのパフォーマンスを向上させるにはどうすればよいですか?
さらに、各ステップの時間を測定して、時間を測定することはできますか?
関連性:http://stackoverflow.com/q/26954404/251311それを楽しむための – zerkms