[英]Most efficient way of subsetting vectors
我需要計算向量子集的均值和方差。 令x
為向量, y
為觀察是否在子集中的指示符。 哪個更有效:
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
的調用是否隱含地執行了這個操作? 或者它們是否存儲了原始矢量?
第二個更快,因為它不必兩次進行子集化嗎?
我關注速度和大數據集的內存管理。
對長度為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
這不是surprising- mean(x[y])
也必須創建一個新的對象為mean
功能作用,即使它不將其添加到本地命名空間。 因此, f1
對於必須進行兩次子集化的速度較慢(正如您所推測的那樣)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.