私は現在、Rの代わりにClojureとIncanterを検討しています(Rが嫌いなわけではありませんが、新しい言語を試すのは面白いです)。Incanterが好きで、構文が魅力的ですが、ベクトル化された操作は比較するとかなり遅いです。たとえば、RまたはPythonに。
例として、Incanterベクトル演算、Clojureマップ、およびRを使用して、ベクトルの1次差分を取得したいと思いました。以下は、すべてのバージョンのコードとタイミングです。ご覧のとおり、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でベクトル演算を高速化する方法があるのだろうかと思っていましたか?また、Clojureのループ、Java配列、ライブラリの使用を含むソリューションも歓迎します。
また、この質問をIncanter Googleグループに投稿しましたが、これまでのところ回答はありません。
更新:私はJouniの回答を承認済みとしてマークしました。彼のコードを少しクリーンアップし、いくつかのベンチマークを追加した私自身の回答については、以下を参照してください。