> (itera-6ren">
gpt4 book ai didi

optimization - Clojure - 优化线程映射减少

转载 作者:行者123 更新时间:2023-12-03 15:45:47 27 4
gpt4 key购买 nike

我有以下代码:

(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)可能是一两秒钟,但是 (series-sum 25000)我必须杀死我的 REPL。

我试着搬家 (take n)尽可能,但这还不够。我觉得我不了解 Clojure,因为我不明白为什么它会变慢(我希望 (series-sum 25000) 大约是 (series-sum 2500) 的 10 倍)。

有一个明显的循环/重复解决方案来优化它,但我喜欢能够打印步骤并有一个步骤的想法( (take n) 看起来像文档字符串)。

如何在保持可调试性的同时提高此代码的性能?

更好的是,我可以测量每一步的时间来查看花费时间的步骤吗?

最佳答案

是的,它与@zerkms 的链接有关。您映射到有理数,可能应该更好地映射到浮点数:

(defn series-sum
"Compute a series : (+ 1 1/4 1/7 1/10 1/13 1/16 ...)"
[n]
(->> (iterate (partial + 3) 1)
(take n)
(map #(/ 1.0 %))
(reduce +)
(format "%.2f")))

现在它工作得更快:
user> (time (series-sum 2500000))
"Elapsed time: 686.233199 msecs"
"5,95"

关于optimization - Clojure - 优化线程映射减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33091143/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com