gpt4 book ai didi

clojure - PI 近似值 : Why is my declarative version slower?

转载 作者:行者123 更新时间:2023-12-02 12:00:31 30 4
gpt4 key购买 nike

我正在使用该系列近似 PI:

PI Sereies

该系列的函数如下所示:

(defn- pi-series [k]
(/ (if (even? (inc k)) 1 -1)
(dec (* 2 k))))

然后我的系列生成器看起来像*:

(defn pi [n]
(* 4
(loop [k 1
acc 0]
(if (= k (inc n))
acc
(recur (inc k)
(+ acc (double (pi-series k))))))))

使用值 999,999 运行 pi 会产生以下结果:

(time (pi 999999))
;;=> "Elapsed time: 497.686 msecs"
;;=> 3.1415936535907734

这看起来很棒,但我意识到 pi 可以写得更具声明性。这是我最终得到的结果:

(defn pi-fn [n]
(* 4 (reduce +
(map #(double (pi-series %))
(range 1 (inc n))))))

结果如下:

(time (pi-fn 999999))
;;=> "Elapsed time: 4431.626 msecs"
;;=> 3.1415936535907734

注意:声明式版本花费了大约 4 秒的时间。为什么?

为什么声明式版本慢这么多?如何更新声明式版本以使其与命令式版本一样快?

<小时/>
  • 我将 pi 级数的结果转换为 double ,因为使用 clojure 的比率类型执行速度要慢得多。

最佳答案

顺便说一句,您可以将交替有限和表示为两个和的差,从而无需单独调整每个项的符号。例如,

(defn alt-sum [f n]
(- (apply + (map f (range 1 (inc n) 2)))
(apply + (map f (range 2 (inc n) 2)))))

(time (* 4 (alt-sum #(/ 1.0 (dec (+ % %))) 999999)))
; "Elapsed time: 195.244047 msecs"
;= 3.141593653590707

在我的笔记本电脑上,pi 的运行速度为 2500 毫秒。但是,pipi-fn(任一版本)的运行速度约为。相同的速率(比 alt-sum 慢 10 倍)。通常,pi-fnpi更快。你确定你没有在第二次计时之前不小心多插入了一个9吗?与胡安相反,我认为您不会多次迭代该序列,因为这些术语是延迟生成的。

scratch.core> (time (pi 999999))
"Elapsed time: 2682.86669 msecs"
3.1415936535907734
scratch.core> (time (pi-fn 999999))
"Elapsed time: 2082.071798 msecs"
3.1415936535907734
scratch.core> (time (pi-fn-juan 999999))
"Elapsed time: 1934.976217 msecs"
3.1415936535907734
scratch.core> (time (* 4 (alt-sum #(/ 1.0 (dec (+ % %))) 999999)))
"Elapsed time: 199.998438 msecs"
3.141593653590707

关于clojure - PI 近似值 : Why is my declarative version slower?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23207911/

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