我需要计算向量子集的均值和方差。设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
的调用是否隐含地执行了此操作?或者它们是否存储了原始矢量?
第二个更快,因为它不必两次进行子集化吗?
我关注大数据集的速度和内存管理。
答案 0 :(得分: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
对于必须进行两次子集化的速度较慢(正如您所推测的那样)。