gpt4 book ai didi

performance - 使用sapply vs.来有效地写入预分配的数据结构

转载 作者:行者123 更新时间:2023-12-04 13:33:23 24 4
gpt4 key购买 nike

假设我有一个预分配的数据结构,为了提高性能而不是随时间增长数据结构,我想将其写入其中。首先,我尝试使用sapply:

set.seed(1)
count <- 5
pre <- numeric(count)

sapply(1:count, function(i) {
pre[i] <- rnorm(1)
})
pre
# [1] 0 0 0 0 0


for(i in 1:count) {
pre[i] <- rnorm(1)
}
pre
# [1] -0.8204684 0.4874291 0.7383247 0.5757814 -0.3053884

我认为这是因为 sapply中的匿名函数位于不同的范围内(或者R中的环境是?),结果 pre对象不相同。 for循环存在于相同的作用域/环境中,因此可以按预期工作。

我通常尝试采用R机制与Apply函数vs. for进行迭代,但是在这里我没有找到解决方法。对于这种类型的操作,我应该做些其他的事情还是更好的成语吗?

如前所述,我的示例是人为设计的,我对产生正常偏差没有兴趣。相反,我的实际代码处理的是4列150万行数据框。以前,我依靠增长和合并来获得最终数据帧,并决定尝试避免基于基准进行合并和预分配。

最佳答案

sapply并非旨在那样使用。它已经预先分配了结果。

无论如何,for循环不太可能是性能降低的根源。这可能是因为您要重复设置data.frame。例如:

set.seed(21)
N <- 1e4
d <- data.frame(n=1:N, s=sample(letters, N, TRUE))
l <- as.list(d)
set.seed(21)
system.time(for(i in 1:N) { d$n[i] <- rnorm(1); d$s <- sample(letters,1) })
# user system elapsed
# 6.12 0.00 6.17
set.seed(21)
system.time(for(i in 1:N) { l$n[i] <- rnorm(1); l$s <- sample(letters,1) })
# user system elapsed
# 0.14 0.00 0.14
D <- as.data.frame(l, stringsAsFactors=FALSE)
identical(d,D)
# [1] TRUE

因此,您应该遍历各个向量,并在循环后将它们组合成data.frame。

关于performance - 使用sapply vs.来有效地写入预分配的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12973963/

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