在 R 中,如何使 for 循环 运行 更快?
In R how can I make the for loop run faster?
我有以下 2 个时间序列的代码。 maxNo 是时间序列中的元素数。 longStopPrev 是 longStop 的 1 位置滞后版本。变量在循环之前启动,因此它们的大小不会在每次迭代中增加。当maxNo很大时,这个循环需要很长时间才能运行.
是否有任何聪明的方法来避免使用 for 循环和矢量化或使 运行 更快?
我认为主要的挑战是变量 longStopPrev
有机会在循环的每个 运行 中改变,这使得 运行 操作变得困难只有一次作为向量。然而,可能有更好的执行方式,类似于不同的搜索算法。
我已经使用 foreach
进行了测试,但它只会使代码 运行 变慢。我还测试了 for 循环内部的更改
longStopPrev = stats::lag(longStop, k=1,na.pad = TRUE) # lag 1
与:
longStopPrev[i+1] <- longStop[i]
但结果稍慢
我试图在下面制作一个可重现的示例。我在我的时间序列中用 ~10.000 点测试代码,实际上想要 运行 ~100.000 或更长。
require("xts")
set.seed(47); n = 1e1;
data <- xts(rnorm(n)+10,
order.by = seq(as.POSIXct("2017-05-31 17:00:00"), length=n, by="min"))
diff=0.5
longStop = data - diff
longStopPrev = stats::lag(longStop, k=1,na.pad = TRUE) # lag 1
longStopPrev = na.approx(longStopPrev, rule=2,na.rm = FALSE,maxgap=1) # fill NA values by approx
maxNo <- nrow(longStop)
for(i in 1:maxNo) {
if(as.numeric(data[i])>as.numeric(longStopPrev[i]) ){
longStop[i] <- max(longStop[i],longStopPrev[i])
longStopPrev = stats::lag(longStop, k=1,na.pad = TRUE) # lag 1
}
}
longStopPrev = na.approx(longStopPrev, rule=2,na.rm = FALSE,maxgap=1) # fill NA values by approx
我发现在 for 循环之前使用 coredata()
将 xts
转换为 matrix
可以大大加快代码速度。与矩阵相比,显然调用 xts 元素要慢得多。在 for 循环的末尾,如果需要,您可以转换回 xts
。
我有以下 2 个时间序列的代码。 maxNo 是时间序列中的元素数。 longStopPrev 是 longStop 的 1 位置滞后版本。变量在循环之前启动,因此它们的大小不会在每次迭代中增加。当maxNo很大时,这个循环需要很长时间才能运行.
是否有任何聪明的方法来避免使用 for 循环和矢量化或使 运行 更快?
我认为主要的挑战是变量 longStopPrev
有机会在循环的每个 运行 中改变,这使得 运行 操作变得困难只有一次作为向量。然而,可能有更好的执行方式,类似于不同的搜索算法。
我已经使用 foreach
进行了测试,但它只会使代码 运行 变慢。我还测试了 for 循环内部的更改
longStopPrev = stats::lag(longStop, k=1,na.pad = TRUE) # lag 1
与:
longStopPrev[i+1] <- longStop[i]
但结果稍慢
我试图在下面制作一个可重现的示例。我在我的时间序列中用 ~10.000 点测试代码,实际上想要 运行 ~100.000 或更长。
require("xts")
set.seed(47); n = 1e1;
data <- xts(rnorm(n)+10,
order.by = seq(as.POSIXct("2017-05-31 17:00:00"), length=n, by="min"))
diff=0.5
longStop = data - diff
longStopPrev = stats::lag(longStop, k=1,na.pad = TRUE) # lag 1
longStopPrev = na.approx(longStopPrev, rule=2,na.rm = FALSE,maxgap=1) # fill NA values by approx
maxNo <- nrow(longStop)
for(i in 1:maxNo) {
if(as.numeric(data[i])>as.numeric(longStopPrev[i]) ){
longStop[i] <- max(longStop[i],longStopPrev[i])
longStopPrev = stats::lag(longStop, k=1,na.pad = TRUE) # lag 1
}
}
longStopPrev = na.approx(longStopPrev, rule=2,na.rm = FALSE,maxgap=1) # fill NA values by approx
我发现在 for 循环之前使用 coredata()
将 xts
转换为 matrix
可以大大加快代码速度。与矩阵相比,显然调用 xts 元素要慢得多。在 for 循环的末尾,如果需要,您可以转换回 xts
。