>>>>> Hadley Wickham <h.wick...@gmail.com> >>>>> on Mon, 20 Nov 2017 12:50:24 -0600 writes:
> Hi all, > I think there's an unnecessary line in [.Date which has a considerable > impact on performance when subsetting large dates: > x <- Sys.Date() + 1:1e6 > microbenchmark::microbenchmark(x[1]) > #> Unit: microseconds > #> expr min lq mean median uq max neval > #> x[1] 920.651 1039.346 3624.833 2294.404 3786.881 41176.38 100 > `[.Date` <- function(x, ..., drop = TRUE) { > cl <- oldClass(x) > # class(x) <- NULL > val <- NextMethod("[") > class(val) <- cl > val > } > microbenchmark::microbenchmark(x[1]) > #> Unit: microseconds > #> expr min lq mean median uq max neval > #> x[1] 2.738 3.0225 28.40893 3.269 3.513 2470.068 100 > Setting the class of x to NULL is problematic because it forces a > copy, and I'm pretty sure it's unnecessary as NextMethod() does not > consult the class of x, but instead uses .Class. Yes, at least so it looks in src/main/objects.c Also, we had a very similar change a while ago : ------------------------------------------------------------------------ r65926 | luke | 2014-06-12 15:54:38 +0200 (Thu, 12. Jun 2014) | 2 Zeilen GeƤnderte Pfade: M src/library/base/R/datetime.R Commented out class(x) <- NULL in [.POSIXct and [[.POSICct. ------------------------------------------------------------------------ and we never seemed to have followed up in a systematic manner finding other places where this happens and could be eliminated. I see about half a dozen examples in base/R/dates.R alone and am trying to find more in other places. [maybe this used to be necessary for very early different versions of NextMethod() which were not yet optimized using .Class etc] Thank you very much, Hadley! Martin ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel