作为最佳实践的一部分,我正在努力确定是更好地创建一个函数并在矩阵中使用apply()
,还是更好地通过函数循环遍历矩阵。我尝试了两种方式,并惊讶地发现apply()
比较慢。任务是将向量评估为正或负,然后返回一个包含1(如果是正数)和-1(如果是负数)的向量。在mash()
函数中进行循环,在apply()
函数中传递squish()
函数。
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
,它更适合这项任务。或者更好的方法是,按照本帖子中的一些示例,多次复制测试并取平均值,以获得更好的结果:http://stats.stackexchange.com/questions/3235/timing-functions-in-r - Chasemicrobenchmark
包以获得更准确的度量。 - aL3xa