我需要计算向量子集的均值和方差。令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
这不足为奇-
mean(x[y])
确实必须创建一个新对象以使mean
函数起作用,即使它没有将其添加到本地 namespace 中也是如此。因此,f1
由于必须两次进行子设置(如您所推测的那样)而速度较慢。
关于performance - 向量子集的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15093606/