gpt4 book ai didi

r - 为什么 apply() 方法比 R 中的 for 循环慢?

转载 作者:行者123 更新时间:2023-12-03 01:37:25 25 4
gpt4 key购买 nike

作为最佳实践,我试图确定是否最好创建一个函数并在矩阵中 apply() 它,或者是否最好简单地循环一个矩阵功能。我尝试了两种方法,并惊讶地发现 apply() 速度较慢。任务是获取一个向量并将其评估为正或负,然后返回一个向量,如果为正则返回 1,如果为负则返回 -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 循环适用于简单的数值向量。它返回一个与传递给它的类相同的对象。

最佳答案

apply(和 plyr)函数系列的重点不是速度,而是表现力。它们还倾向于防止错误,因为它们消除了循环所需的簿记代码。

最近,stackoverflow 上的答案过分强调了速度。随着计算机变得更快并且 R 核心优化了 R 的内部结构,您的代码本身也会变得更快。您的代码本身永远不会变得更加优雅或更容易理解。

在这种情况下,您可以两全其美:使用向量化得到一个优雅的答案,而且速度也非常快,(million > 0) * 2 - 1

关于r - 为什么 apply() 方法比 R 中的 for 循环慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5533246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com