【发布时间】:2016-09-22 16:31:44
【问题描述】:
我有一个非常简单的函数,它接受一个 POSIXct 日期,提取年份,如果日期在 6 月 1 日之前减去 1。
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 日期的向量上执行此功能时,它需要 FOREVER。
sapply(temp$date, DetermineWaterYear)
此外,我使用以下代码对长度从 10000 到 190000 的向量子集执行 sapply 计时:
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语句来完成(可能几乎是立即)(假设你的日期都很干净,很好格式化日期)。 -
为什么要使用 sapply?我没有检查,但你的函数似乎是矢量化的。
-
@Roland Doh,它是矢量化的,我可以通过DetermineWaterYear(temp$dates) 更快地得到我的结果。不过,仍然很好奇为什么 sapply 陷入如此多的困境。
-
@Joan 这是很多机器,但DetermineWaterYear() 函数将在一秒钟内扩展为更多选项。