ste*_*dv 5 performance for-loop r
我必须加快我的脚本.我有一些周期,如:
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
}
Run Code Online (Sandbox Code Playgroud)
其中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()
Run Code Online (Sandbox Code Playgroud)
我的功能:
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
Run Code Online (Sandbox Code Playgroud)