Mam następujący kod:Clojure - optymalizacja gwintowany mapa zmniejszyć
(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)))
To działa dobrze, poza tym, że to działa w czasie kiedy eksploduje numery uzyskać duże. Na moim komputerze (series-sum 2500)
jest może sekunda lub dwie, ale (series-sum 25000)
i muszę zabić mojego REPL.
Próbowałem przenieść (take n)
w miarę możliwości, ale to nie wystarczy. Czuję, że nie rozumiem czegoś o Clojure, ponieważ nie rozumiem, dlaczego byłoby wolniej (oczekiwałbym, że (series-sum 25000)
potraktuje to mniej więcej 10 razy jako (series-sum 2500)
).
Istnieje oczywiste rozwiązanie pętli/powtórzenia, aby zoptymalizować to, ale podoba mi się pomysł, aby móc drukować kroki i mieć jeden krok ((take n)
wygląda jak docstring).
Jak mogę poprawić wydajność tego kodu przy zachowaniu możliwości debugowania?
Czy mogę jeszcze zmierzyć czas każdego kroku, aby zobaczyć, który zajmuje czas?
Ważne: http://stackoverflow.com/q/26954404/251311 – zerkms