3
我有一個非常簡單的函數,它接受一個POSIXct日期中提取年,並減去1如果日期是6月1日在日期的矢量上使用sapply:函數非常慢。爲什麼?
library(lubridate)
DetermineWaterYear <- function(date,
return.interval=FALSE){
wy <- year(date) + ifelse(month(date)>=6, 0, -1)
if(return.interval==FALSE){
return(wy)
} else {
interval <- interval(ymd(cat(wy),'06-01', sep=''), ymd(cat(wy+1),'05-31', sep=''))
return(interval)
}
}
之前,當我嘗試使用sapply(),以在執行此功能約190k日期的向量,它需要永遠。
sapply(temp$date, DetermineWaterYear)
此外,我主頻也從長度10000矢量的子集進行sapply至190000使用下面的代碼:
tempdates <- rep(ymd('1956-01-01'), 190000)
index <- seq(10000,190000,10000)
for(i in 1:length(index)){
times[i] <- system.time(sapply(tempdates[1:index[i]], DetermineWaterYear))[3]
}
瘋狂的事情是,隨着日期的載體變長,每個記錄的處理時間大大增加......處理190k日期所需的時間是10k個日期所需的時間的238倍。我有足夠的內存可用。
這是爲什麼表現這麼慢?我怎樣才能優化它?
這似乎是一個可怕的很多重型機械的東西這可以通過在日期的字符表示上假設一個單獨的'ifelse'語句(假設你的日期都是乾淨的,格式良好的日期)來完成(可能幾乎立即)。 – joran
爲什麼使用sapply?我沒有檢查,但你的功能似乎是矢量化的。 – Roland
@Roland Doh,它是矢量化的,我可以做DetermineWaterYear(temp $日期)來得到我的結果,速度要快得多。儘管如此,仍然很好奇爲什麼薩克利會如此沉迷。 – user278411