2013-02-26 42 views
9

Ben bir vektör bir alt kümesi ortalamasını ve varyansını hesaplamak gerekir vektörleri. x vektörü olsun ve y, gözlemin alt grupta olup olmadığını gösteren bir gösterge olsun. Hangisi daha verimlidir:En etkili yolu

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

veya

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

Birinci yaklaşım yeni bir nesne açıkça yaratmaz; ama mean ve var numaralarına yapılan çağrılar bunu dolaylı olarak yapıyor mu? Yoksa orijinal vektörde depolandığı gibi mi çalışıyorlar?

iki kez subsetting yapmak zorunda değildir, çünkü daha hızlı ikinci mı?

Ben hızıyla ve büyük veri kümeleri için bellek yönetimi ile endişeleniyorum. uzunluk 10M bir vektör üzerine

+0

gerçekten büyük veri kümelerinde çalışma hakkında endişeleriniz varsa, o zaman Ar uzaklaştıkça (veya örnekleme bir sürü yapmak) gerekecek. Bu arada, neden iki yaklaşımı kıyaslamıyorsunuz? –

+7

@JackManey: Bu, yalnızca, kullanıcının "büyük" veri kümelerinin ne kadar büyük olduğunu bilmediğinizden, doğru (veya yapıcı) değil. –

+2

@JackManey 'ff' ve 'ffbase' paketleri (ve diğer "büyük veri" paketler) ile saf açık kaynak R verimi ve hızı ile çok büyük veri setleri taşıma oldukça sahip olabilir. Revolutions Analytics milletvekilleri, R'nin "büyük veri" glm çalışmaları için SAS'dan daha iyi performans sağlamak için genişletilebileceğinin bir kanıtıdır. Baz paketleri * büyük veri kümeleri altında parçalanmasına rağmen, R bir şişe boynuna sahip değildir. – Dinre

cevap

7

Kıyaslama ikinci yaklaşım hızlıdır (benim makinede) olduğunu gösterir:

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 

Bu surprising- değildir mean(x[y])yaparmean için yeni bir nesne oluşturmak zorunda Yerel ad alanına eklemese bile, harekete geçme işlevi. Bu nedenle, f1, altölçmeyi iki kez yapmak zorunda kaldığınız için daha yavaştır (sizin de belirttiğiniz gibi).

+0

microbenchmark paketi karşılaştırma için bu tür çok daha iyidir: 'kitaplığı (microbenchmark); microbenchmark (f1 (x, y), f2 (x, y)) ' – hadley

İlgili konular