我需要计算向量子集的均值和方差。设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
函数创建一个新对象,即使它不将其添加到本地命名空间中。因此,f1
因为必须执行两次子集(如您所猜测的)而较慢。