performance - 向量子集的最有效方法

标签 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的调用会隐式执行此操作吗?还是在存储的原始向量上工作?

第二秒是否更快,因为它不必进行两次子集设置?

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

最佳答案

在长度为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/

相关文章:

MySQL LIMIT x,y 在两台机器上的性能差异巨大

r - 在 R 包文档 (.Rd) 文件中包含图像

python - Python 中的 plyr 或 dplyr

r - 如何识别 R 中具有重复值的列的名称

r - ddply : push or pull?

具有可变列的 read.table

.net - 为什么 Enumerable<T>.ToArray() 可以先调用 Count() 时使用中间缓冲区?

ios - 应用程序性能问题

matlab - 找到向量 b 的唯一索引的最快方法,其中数组 A(i,j) == b

algorithm - 加速此功能的可能性是什么?