[英]In R how can I make the for loop run faster?
我有以下代碼,屬於 2 個時間序列。 maxNo 是時間序列中的元素數。 longStopPrev 是 longStop 的 1 position 滯后版本。 變量在循環之前啟動,因此它們的大小不會在每次迭代中增加。 當 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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.