В настоящее время я рассматриваю Clojure и Incanter как альтернативу Р. (Не то, чтобы мне не нравилось R, но просто интересно попробовать новые языки.) Мне нравится Incanter и найти синтаксис, привлекательный, но векторизованные операции довольно медленны по сравнению, например на R или Python.
В качестве примера я хотел получить разность первого порядка для вектора с использованием векторных операций Incanter, карты Clojure и 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"
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
Итак, мне было интересно, есть ли способ ускорить векторные операции в Incanter/ Clojure? Также приветствуются решения, связанные с использованием циклов, массивов Java и/или библиотек из Clojure.
Я также разместил этот вопрос для группы Incanter Google без ответов.
ОБНОВЛЕНИЕ: Я отметил ответ Jouni как принятый, см. ниже мой собственный ответ, где я немного очистил его код и добавил некоторые тесты.