gpt4 book ai didi

performance - 比较记录结果和 Double For 循环

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

我有一个双循环,我不仅不喜欢它,而且在我的计算机上运行需要 14 天,因为每次迭代它会处理超过 3200 条记录和 1090 个变量,速度约为 0.12。

更小的可重现位。它只是检查两条记录之间同一列中有多少个数字,不包括 NA。然后它将结果附加到原始数据框。

y <- data.frame(c(1,2,1,NA,NA),c(3,3,3,4,NA),c(5,4,5,7,7),c(7,8,7,9,10))
resultdf <- NULL
for(i in 1:nrow(y))
{
results <- NULL
for(j in 1:nrow(y))
{
results <- c(results,sum((y[i,]==y[j,]),na.rm=TRUE))
}
resultdf <- cbind(resultdf,results)
}
y <- cbind(y,resultdf)

我有重复计算,可能可以避免留下大约 7 天的时间。

如果我理解正确的话,一些应用函数是用 C 语言编写的,可能会更快。但我还没能找到任何工作。我也很好奇是否有一个包可以运行得更快。谁能帮助加快计算速度?

谢谢!

最佳答案

我已经根据您的规范创建了数据,并使用了 @BenBolker 关于使用矩阵的建议:

> y <- matrix(sample(c(1:9, NA), 3200 * 1090, replace = TRUE),
+ nrow = 3200, ncol = 1090)

并比较了三种不同实现的计算时间:

f1 由 @Andrei 建议:

> f1 <- function(y)apply(y, 1, function(r1)
+ apply(y, 1, function(r2)sum(r1==r2, na.rm=TRUE)))

> system.time(r1 <- f1(y))
user system elapsed
523.51 0.77 528.73

f2 由@VincentZoonekynd 建议:

> f2 <- function(y) {
+ f <- function(i,j) sum(y[i,] == y[j,], na.rm=TRUE)
+ d <- outer( 1:nrow(y), 1:nrow(y), Vectorize(f) )
+ return(d)
+ }
> system.time(r2 <- f2(y))
user system elapsed
658.94 1.96 710.67

f3 是上三角形上的双循环,如 @BenBolker 所建议。它也比你的 OP 更高效,因为它预先分配了输出矩阵:

> f3 <- function(y) {
+ result <- matrix(NA, nrow(y), nrow(y))
+ for (i in 1:nrow(y)) {
+ row1 <- y[i, ]
+ for (j in i:nrow(y)) {
+ row2 <- y[j, ]
+ num.matches <- sum(row1 == row2, na.rm = TRUE)
+ result[i, j] <- num.matches
+ result[j, i] <- num.matches
+ }
+ }
+ return(result)
+ }

> system.time(r3 <- f3(y))
user system elapsed
167.66 0.08 168.72

因此,双循环是这三个答案中最快的,尽管不如其他两个答案那么优雅和紧凑。

关于performance - 比较记录结果和 Double For 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9573906/

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