почему обработка временных меток такая медленная - PullRequest
1 голос
/ 30 июня 2019

Рассмотрим этот простой пример.

library(lubridate)
library(dplyr)

df1 <- tibble(timestamp = c(ymd_hms('2019-01-01 10:00.00.123'),
                     ymd_hms('2019-01-01 10:00.00.123'),
                     ymd_hms('2019-01-01 10:00.00.123'),
                     ymd_hms('2019-01-01 10:00.00.123')))


df2 <- tibble(timestamp = c(ymd_hms('2019-01-01 10:00.00.123'),
                            ymd_hms('2019-01-01 10:00.00.123'),
                            ymd_hms('2019-01-01 10:00.00.123'),
                            ymd_hms('2019-01-01 10:00.00.123'))) %>% 
  mutate(timestamp = as.numeric(timestamp))

Как видите, единственная разница между df1 и df2 состоит в представлении меток времени.

Не смотрите набезумная разница во времени

#first lets make them bigger. 400k rows is enough
df1 <- map_dfr(seq(1:100000), ~df1)
df2 <- map_dfr(seq(1:100000), ~df2)

Теперь простое вычисление

> microbenchmark(
+   df2 %>% mutate(diff = timestamp - min(timestamp)),
+ times = 1000)
Unit: milliseconds
                                              expr      min       lq     mean   median
 df2 %>% mutate(diff = timestamp - min(timestamp)) 1.541533 2.182028 3.961685 2.327694
       uq     max neval
 2.567314 290.823  1000

, а

> microbenchmark(
+   df1 %>% mutate(diff = timestamp - min(timestamp)),
+ times = 1000)
Unit: milliseconds
                                              expr      min       lq    mean   median
 df1 %>% mutate(diff = timestamp - min(timestamp)) 4.111016 8.182359 13.1351 8.513956
       uq      max neval
 9.065631 378.1961  1000

Бум!более чем в 3 раза медленнее.Это почему?Спасибо!

...