【发布时间】:2018-08-29 16:30:12
【问题描述】:
这是重现 Ross Ihaka 给出的一些代码的简单尝试,作为 R 性能不佳的示例。我很好奇 Clojure 的持久数据结构是否会提供任何改进。 (https://www.stat.auckland.ac.nz/~ihaka/downloads/JSM-2010.pdf)
但是,我什至没有到达一垒,并且报告了堆栈溢出,并且没有太多其他内容可以参考。有任何想法吗?如果问题有我错过的明显答案,请提前道歉......
; Testing Ross Ihaka's example of poor R performance
; against Clojure, to see if persisntent data structures help
(def dd (repeat 60000 '(0 0 0 0)))
(defn repl-row [d i new-r]
(concat (take (dec i) d) (list new-r) (drop i d)))
(defn changerows [d new-r]
(loop [i 10000
data d]
(if (zero? i)
data
(let [j (rand-int 60000)
newdata (repl-row data j new-r)]
(recur (dec i) newdata)))))
user=> (changerows dd '(1 2 3 4))
StackOverflowError clojure.lang.Numbers.isPos (Numbers.java:96)
此外,如果有人知道如何在上面的示例中充分利用持久性函数数据结构,我会很想听听。据报告不使用不可变结构(上面的链接)的加速比约为 500%!
【问题讨论】:
-
你正在脱离循环。我用较小的数字进行了测试并修改了您的代码,因此很明显
if有两个分支。