コードをベンチマークして、経験的に答えを得ることができます。ベクトルをあらかじめ割り当てておくことで、増加するベクトルの問題を回避するループフレーバーの2つ目も追加しました。 relative
列を見ると
repl_function = function(no_rep) means <- replicate(no_rep, mean(rnorm(50)))
for_loop = function(no_rep) {
means <- c()
for(i in 1:no_rep) {
means <- c(means, mean(rnorm(50)))
}
means
}
for_loop_prealloc = function(no_rep) {
means <- vector(mode = "numeric", length = no_rep)
for(i in 1:no_rep) {
means[i] <- mean(rnorm(50))
}
means
}
no_loops = 50e3
benchmark(repl_function(no_loops),
for_loop(no_loops),
for_loop_prealloc(no_loops),
replications = 3)
test replications elapsed relative user.self sys.self
2 for_loop(no_loops) 3 18.886 6.274 17.803 0.894
3 for_loop_prealloc(no_loops) 3 3.209 1.066 3.189 0.000
1 repl_function(no_loops) 3 3.010 1.000 2.997 0.000
user.child sys.child
2 0 0
3 0 0
1 0 0
、非事前に割り当てループのためには、6.2倍遅くなります。しかし、事前に割り当てられたforループは、replicate
と同じくらい速いです。
事前に割り当てられたforループは、 'replicate'と同じ速さです。私はそれがコードの大部分がRで費やされているからだと思います。ループ全体を「平均」の周りに再実装します。おそらくC++はかなりスピードアップします。私の答えのベンチマークを参照してください。 –