最有效的子集化向量方法

时间:2013-02-26 15:58:09

标签: performance r

我需要计算向量子集的均值和方差。设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

第一种方法没有明确地创建新对象;但是对meanvar的调用是否隐含地执行了此操作?或者它们是否存储了原始矢量?

第二个更快,因为它不必两次进行子集化吗?

我关注大数据集的速度和内存管理。

1 个答案:

答案 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对于必须进行两次子集化的速度较慢(正如您所推测的那样)。