9

ベクトルのサブセットの平均と分散を計算する必要があります。をベクトルxyし、観測がサブセット内にあるかどうかの指標とします。どちらがより効率的ですか:

sub.mean <- mean(x[y])
sub.var  <-  var(x[y])

また

sub      <- x[y]
sub.mean <- mean(sub)
sub.var  <-  var(sub)
sub      <- NULL

最初のアプローチでは、新しいオブジェクトを明示的に作成しません。しかし、呼び出しをmean行い、varそれを暗黙的に行いますか? それとも、保存されている元のベクトルで機能しますか?

サブセット化を2回行う必要がないため、2番目の方が高速ですか?

大規模なデータセットの速度とメモリ管理に関心があります。

4

1 に答える 1

7

長さ 10M のベクトルでのベンチマークは、(私のマシンでは) 後者のアプローチの方が高速であることを示しています。

f1 = function(x, y) {
    sub.mean <- mean(x[y])
    sub.var  <-  var(x[y])
}

f2 = function(x, y) {
    sub      <- x[y]
    sub.mean <- mean(sub)
    sub.var  <-  var(sub)
    sub      <- NULL
}

x = rnorm(10000000)
y = rbinom(10000000, 1, .5)

print(system.time(f1(x, y)))
#   user  system elapsed 
#  0.403   0.037   0.440 
print(system.time(f2(x, y)))
#   user  system elapsed 
#  0.233   0.002   0.235 

これは驚くべきことではありmean(x[y]) ませmeanん。ローカル名前空間に追加しない場合でも、関数が作用するために新しいオブジェクトを作成する必要があります。したがって、f1サブセット化を 2 回行う必要がある場合は遅くなります (ご想像のとおり)。

于 2013-02-26T16:09:51.233 に答える