ho il seguente codice:Clojure - ottimizzare una mappa filettato ridurre
(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)))
Si sta lavorando bene, salvo che in esecuzione esplode tempo quando i numeri diventano grandi. Sul mio computer (series-sum 2500)
è forse un secondo o due, ma (series-sum 25000)
e devo uccidere il mio REPL.
Ho provato a spostare (take n)
il più lontano possibile, ma ciò non è sufficiente. Sento che non capisco qualcosa su Clojure poiché non vedo perché sarebbe più lento (mi aspetterei che lo (series-sum 25000)
richieda circa 10 volte come (series-sum 2500)
).
C'è una soluzione loop/recur evidente per ottimizzarlo, ma mi piace l'idea di poter stampare i passaggi e di avere un passo (il (take n)
sembra come la docstring).
Come posso migliorare le prestazioni di questo codice mantenendo la debugabilità?
Ancora meglio, posso misurare il tempo di ogni passaggio per vedere quello che richiede tempo?
Relevant: http://stackoverflow.com/q/26954404/251311 – zerkms