gpt4 book ai didi

performance - 为什么这么慢? (DF行中的循环与独立向量中的循环)

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

我有一段代码,总耗时约30秒,下面的代码约27秒。我将令人讨厌的代码缩小为:

d$dis300[i] <- h

所以我换了另一部分,现在工作非常快(如预期的那样)。

我的问题是,为什么与第二个相比太慢了。 datos DF约为7500x18 vars

第一:(经过27秒)
d$dis300 <- 0
for (i in 1:netot) {
h <- aaa[d$ent[i], d$dis[i]]
if (h == 0) writeLines(sprintf("ERROR. ent:%i dis:%i", d$ent[i], d$dis[i]))
d$dis300[i] <- h
}

秒:(经过0.2秒)
d$dis300 <- 0
for (i in 1:netot) {
h <- aaa[d$ent[i], d$dis[i]]
if (h == 0) writeLines(sprintf("ERROR. ent:%i dis:%i", d$ent[i], d$dis[i]))
foo[i] <- h
}
d$foo <- foo

您可以看到两者都是“相同的”,但令人讨厌的人拥有此DF而不是单个向量。

任何评论都非常感谢。我来自另一种语言,这使我发疯了一段时间。至少我有解决方案,但我希望将来避免此类问题。

谢谢你的时间,

最佳答案

原因是d$dis300[i] <- h调用$<-.data.frame

如您所见,这是一个相当复杂的功能:

`$<-.data.frame`

您没有说什么 foo是什么,但是如果它是一个原子向量,则 $<-函数在C中实现了速度。

不过,我还是希望您声明foo如下:
foo <- numeric(netot)

这将确保您不需要为循环中的每个分配重新分配向量:
foo <- 0 # BAD!
system.time( for(i in 1:5e4) foo[i] <- 0 ) # 4.40 secs
foo <- numeric(5e4) # Pre-allocate
system.time( for(i in 1:5e4) foo[i] <- 0 ) # 0.09 secs

而是使用 *apply系列,您不必担心:
d$foo <- vapply(1:netot, function(i, aaa, ent, dis) {
h <- aaa[ent[i], dis[i]]
if (h == 0) writeLines(sprintf("ERROR. ent:%i dis:%i", ent[i], dis[i]))
h
}, numeric(1), aaa=aaa, ent=d$ent, dis=d$dis)

...在这里,我还在循环外提取了 d$entd$dis,这也应该有所改善。但是由于您没有提供可重复的数据,因此无法自己运行。但是,这是一个类似的示例:
d <- data.frame(x=1)
system.time( vapply(1:1e6, function(i) d$x, numeric(1)) ) # 3.20 secs
system.time( vapply(1:1e6, function(i, x) x, numeric(1), x=d$x) ) # 0.56 secs

...但是最终看来,所有这些都可以简化为(除非您的错误检测代码):
d$foo <- aaa[cbind(d$ent, d$dis)]

关于performance - 为什么这么慢? (DF行中的循环与独立向量中的循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10307543/

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