【发布时间】:2020-03-03 22:30:08
【问题描述】:
是否可以矢量化/加速使用先前迭代值的 FOR 循环的执行?
在下面的复制示例中:
- 当前产量是根据当前库存计算得出的
- 当前生产更新 NEXT 库存
- 下一次迭代使用更新后的库存来确定当前的产量等...
所以我需要在每次迭代时计算库存,以便计算生产设定点......是否可以避免(慢)for循环?
对于 50k 行,当前实现大约需要 45 秒。
# Dummy functions for the examples. Real code is more complicated
function1 <- function(energy, stock, critical) {
if (stock < critical) {
return (energy)
} else {
return(0)
}
}
function2 <- function(power) {
return(round(power/100))
}
# Dummy data
d <- data.frame( "energy"= c(660, 660, 660, 660),
"stock" = c(20, 0, 0, 0),
"delivery" = c(0, 0, 2, 0),
"critical" = c(50, 50 ,50, 50),
"power" = c(0, 0, 0, 0),
"production" = c(0, 0, 0, 0) )
for (i in 1:length(d$energy)) {
# Computing power, based on CUURENT stock
d$power[i] <- function1(d$energy[i], d$stock[i], d$critical[i])
# Computing production
d$production[i] <- function2(d$power[i])
# Updating NEXT stock with current production / delivery
if (i < length(d$energy)) {
d$stock[i+1] <- d$stock[i] + d$production[i] - d$delivery[i]
}
}
View(d)
【问题讨论】:
-
您也许可以使用
lapply或map等伪循环来加快速度,但问题可能出在您的两个函数的设计中,而不是在循环中本身。如果您使用的是 RStudio,请尝试在您的函数上运行“配置文件”以查看时间花费在哪里。 -
有什么理由用大写锁定写
for? -
This 可能会有所帮助。你的功能看起来不错。它尽可能快。正如@AndrewGustar 在他的评论中指出的那样,这不是你的循环,而是你的函数。为了回答您的问题,您可以优化您的函数或用 C 或 Fortran 重写您的代码。