[英]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.