我目前正在研究 Clojure 和 Incanter 作为 R 的替代品。(不是我不喜欢 R,但尝试新语言很有趣。)我喜欢 Incanter 并且发现语法很吸引人,但相比而言,矢量化操作相当慢例如到 R 或 Python。
例如,我想使用 Incanter 向量运算、Clojure map 和 R 获得向量的一阶差分。以下是所有版本的代码和时间。如您所见,R 显然更快。
Incanter 和 Clojure:
(use '(incanter core stats))
(def x (doall (sample-normal 1e7)))
(time (def y (doall (minus (rest x) (butlast x)))))
"Elapsed time: 16481.337 msecs"
(time (def y (doall (map - (rest x) (butlast x)))))
"Elapsed time: 16457.850 msecs"
回复:
rdiff <- function(x){
n = length(x)
x[2:n] - x[1:(n-1)]}
x = rnorm(1e7)
system.time(rdiff(x))
user system elapsed
1.504 0.900 2.561
所以我想知道有没有办法加快 Incanter/Clojure 中的向量操作?还欢迎使用 Clojure 中的循环、Java 数组和/或库的解决方案。
我也将这个问题发布到 Incanter Google 组,到目前为止没有任何回应。
更新:我已将 Jouni 的答案标记为已接受,请参阅下面的我自己的答案,我已经清理了他的代码并添加了一些基准。