Ответ 1
По той же причине автомобили медленнее по сравнению с верхом на ракетах. Дополнительная простота в использовании и безопасность делают автомобили намного медленнее, чем ракеты, но вероятность того, что их взорвут, будет меньше, и вам будет легче заводить, управлять и тормозить автомобиль. Тем не менее, в правильной ситуации (например, мне нужно попасть на Луну) ракета является подходящим инструментом для работы. Теперь, если бы кто-то изобрел машину с ракетой, привязанной к крыше, у нас было бы что-то.
Начните с рассмотрения того, что делает dmy
, и вы увидите разницу в скорости (кстати, из ваших bechmarks я бы не сказал, что lubridate
намного медленнее, чем в миллисекундах):
dmy
#type это в командной строке, и вы получите:
>dmy
function (..., quiet = FALSE, tz = "UTC")
{
dates <- unlist(list(...))
parse_date(num_to_date(dates), make_format("dmy"), quiet = quiet,
tz = tz)
}
<environment: namespace:lubridate>
Сразу вижу parse_date
num_to_date
и make_format
. Заставляет задуматься, что это за ребята. Давай посмотрим:
parse_date
> parse_date
function (x, formats, quiet = FALSE, seps = find_separator(x),
tz = "UTC")
{
fmt <- guess_format(head(x, 100), formats, seps, quiet)
parsed <- as.POSIXct(strptime(x, fmt, tz = tz))
if (length(x) > 2 & !quiet)
message("Using date format ", fmt, ".")
failed <- sum(is.na(parsed)) - sum(is.na(x))
if (failed > 0) {
message(failed, " failed to parse.")
}
parsed
}
<environment: namespace:lubridate>
num_to_date
> getAnywhere(num_to_date)
A single object matching ‘num_to_date was found
It was found in the following places
namespace:lubridate
with value
function (x)
{
if (is.numeric(x)) {
x <- as.character(x)
x <- paste(ifelse(nchar(x)%%2 == 1, "0", ""), x, sep = "")
}
x
}
<environment: namespace:lubridate>
make_format
> getAnywhere(make_format)
A single object matching ‘make_format was found
It was found in the following places
namespace:lubridate
with value
function (order)
{
order <- strsplit(order, "")[[1]]
formats <- list(d = "%d", m = c("%m", "%b"), y = c("%y",
"%Y"))[order]
grid <- expand.grid(formats, KEEP.OUT.ATTRS = FALSE, stringsAsFactors = FALSE)
lapply(1:nrow(grid), function(i) unname(unlist(grid[i, ])))
}
<environment: namespace:lubridate>
Ничего себе, у нас есть strsplit-ting
, expand-ing.grid-s
, paste-ing
, ifelse-ing
, unname-ing
т.д., А также проверка unname-ing
Lotta Error при unname-ing
(игра на песне Zep). Так что у нас есть хороший синтаксический сахар. Ммммм вкусно, но это идет с ценой, скоростью.
Сравните это с as.POSIXct
:
getAnywhere(as.POSIXct) #tells us to use methods to see the business
methods('as.POSIXct') #tells us all the business
as.POSIXct.date #what I believe your code is using (I don't use dates though)
В as.POSIXct
намного больше внутреннего кодирования и меньше проверок на as.POSIXct
Итак, вы должны спросить: хочу ли я простоты и безопасности или скорости и мощности? Зависит от работы.