gpt4 book ai didi

r - 用 R 加速迭代循环计算

转载 作者:行者123 更新时间:2023-12-04 17:30:21 25 4
gpt4 key购买 nike

我必须加快我的脚本。我有一些周期,如:

DT <- data.frame(Index=1:20, A=c(10:29))

cost1 <- 3
cost2 <- 0.05
cost3 <- 50

DT$S[1] <- cost1
for (j in 2:(20)) {
DT$S[j] <- DT$S[j-1]-cost3+DT$S[j-1]*cost2/12
}

其中 cost1 和 cost2 是常数。是否有可能避免写一个循环?

最佳答案

您的方法的主要问题是您重复调用 data.frame ( DT$S ) 的元素,但在此计算中不需要。如果我们用 vector 替换它并在最后将结果添加到 data.frame 中,它会快得多。我们也可以简化公式。

n <- 1e4
DT <- data.frame(Index = 1:n, A = seq(10, by = 1, length.out = n))

cost1 <- 3
cost2 <- 0.05
cost3 <- 50

your <- function() {
DT$S[1] <- cost1
for (j in 2:(n)) {
DT$S[j] <- DT$S[j - 1] - cost3 + DT$S[j - 1]*cost2/12
}
}
your()

我的功能:
my <- function() {    
cc <- (1 + cost2/12)
r <- vector('numeric', length = n)
r[1] <- cost1
for (j in 2:(n)) {
# r[j] <- r[j - 1] - cost3 + r[j - 1] * cost2/12
r[j] <- r[j - 1] * cc - cost3
}
r
}

DT$S2 <- my()
all.equal(DT$S, DT$S2)
# [1] TRUE

microbenchmark::microbenchmark(your(), my(), times = 2)
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# your() 487.229621 487.229621 490.86917 490.86917 494.508715 494.508715 2 b
# my() 1.515178 1.515178 1.59408 1.59408 1.672982 1.672982 2 a

关于r - 用 R 加速迭代循环计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51056820/

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