【发布时间】:2011-07-28 20:12:42
【问题描述】:
作为最佳实践,我正在尝试确定是创建一个函数并在矩阵中apply() 它是否更好,或者是否最好在函数中简单地循环一个矩阵。我尝试了两种方式,并惊讶地发现apply() 速度较慢。任务是获取一个向量并将其评估为正数或负数,然后如果它是正数则返回一个向量,如果它是负数则返回 -1。 mash() 函数循环,squish() 函数被传递给apply() 函数。
million <- as.matrix(rnorm(100000))
mash <- function(x){
for(i in 1:NROW(x))
if(x[i] > 0) {
x[i] <- 1
} else {
x[i] <- -1
}
return(x)
}
squish <- function(x){
if(x >0) {
return(1)
} else {
return(-1)
}
}
ptm <- proc.time()
loop_million <- mash(million)
proc.time() - ptm
ptm <- proc.time()
apply_million <- apply(million,1, squish)
proc.time() - ptm
loop_million 结果:
user system elapsed
0.468 0.008 0.483
apply_million 结果:
user system elapsed
1.401 0.021 1.423
如果性能下降,使用apply() 比for 循环有什么优势?我的测试有问题吗?我比较了两个结果对象以寻找线索,发现:
> class(apply_million)
[1] "numeric"
> class(loop_million)
[1] "matrix"
这只会加深谜团。 apply() 函数不能接受简单的数字向量,这就是为什么我在开始时使用 as.matrix() 进行转换。但随后它返回一个数字。 for 循环适用于简单的数字向量。它返回一个与传递给它的对象具有相同类的对象。
【问题讨论】:
-
使用
system.time()而不是proc.time,它更适合这项任务。或者更好的是,按照这篇文章中的一些示例,通过多次复制测试并取其平均值来获得更好的结果:stats.stackexchange.com/questions/3235/timing-functions-in-r -
感谢时间链接。刚刚开始进行基准测试。
-
您还应该检查
microbenchmark包以获得更准确的测量值。
标签: r benchmarking