我目前正在研究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"
Run Code Online (Sandbox Code Playgroud)
R:
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
Run Code Online (Sandbox Code Playgroud)
所以我想知道有没有办法加速Incanter/Clojure中的矢量操作?还欢迎涉及使用来自Clojure的循环,Java数组和/或库的解决方案.
我还向Incanter Google小组发布了此问题,目前尚无回复.
更新:我已将Jouni的答案标记为已接受,请参阅下面的我自己的答案,我已经清理了他的代码并添加了一些基准测试.
什么是Clojure中矩阵的良好表示?我对处理浮点数密集矩阵很感兴趣.脑海中浮现出"列表清单"的表现形式,但还有更好的东西吗?
良好代表性的一些标准包括:
map有pmap,那将是很好的.reduce:似乎很多我正在做的计算很好reduce.有什么想法吗?