2017-02-16 22 views
-1

Я был недоволен временем, когда dplyr и data.table принимали, чтобы создать новую переменную на моем data.frame и решить сравнить методы.Почему переназначение нового имени в dataframe в dplyr делает его быстрее?

К моему удивлению, переназначение результатов dplyr :: mutate() на новый data.frame, кажется, быстрее, чем не делает этого.

Почему это происходит?

library(data.table) 
library(tidyverse) 


dt <- fread(".... data.csv") #load 200MB datafile 

dt1 <- copy(dt) 
dt2 <- copy(dt) 
dt3 <- copy(dt) 

a <- Sys.time() 
dt1[, MONTH := month(as.Date(DATE))] 
b <- Sys.time(); datatabletook <- b-a 

c <- Sys.time() 
dt_dplyr <- dt2 %>% 
    mutate(MONTH = month(as.Date(DATE))) 
d <- Sys.time(); dplyr_reassign_took <- d - c 

e <- Sys.time() 
dt3 %>% 
    mutate(MONTH = month(as.Date(DATE))) 
f <- Sys.time(); dplyrtook <- f - e 

datatabletook  = 17sec 
dplyrtook   = 47sec 
dplyr_reassign_took = 17sec 
+1

'dt1 <- dt' не создает новый объект, называемый' dt1'; он просто делает другой указатель на 'dt'. Попробуйте 'dt1 <- copy (dt)'. – Frank

+0

@Frank - отредактировал вопрос с вашим предложением. Аналогичные результаты. – Dan

+1

Хорошо, интересный/неожиданный результат. Я думаю, было бы полезно иметь его для воспроизводимого примера. – Frank

ответ

2

Есть несколько способов benchmark with base R:

.t0 <- Sys.time() 
    ... 
.t1 <- Sys.time() 
.t1 - t0  

# or 

system.time({ 
    ... 
}) 

С Sys.time образом, вы отправляете каждую строку на консоль и можете увидеть некоторое возвращаемое значение распечатанного для каждой линии, как @Axeman предложил. С {...} существует только одно возвращаемое значение (последний результат внутри фигурных скобок) и system.time будет подавлять его от печати.

Если печать достаточно дорогостоящая, но не является частью того, что вы хотите измерить, это может изменить ситуацию.


Есть веские причины, чтобы предпочесть system.time над Sys.time для сравнительного анализа; от @ комментария MattDowle в:

I) он делает дс первым исключен из времени, чтобы изолировать от случайного дса-х и

II) включает в себя user и sys время, а также elapsed настенных часов времени.

Sys.time() путь будет зависеть от чтения электронной почты в Chrome или с помощью Excel в то время как тест выполняется, то system.time() путь будет не так долго, как вы используете user и sys части результата.

+1

'system.time ({...})' намного лучше, потому что i) он сначала исключает gc из времени для выделения из случайных gc и ii) он также включает время 'user' и' sys' как «истекшее» время настенных часов. Путь 'Sys.time()' будет зависеть от чтения вашей электронной почты в Chrome или с помощью Excel во время запуска теста 'system.time() 'будет не так долго, как вы используете части результата' user' и 'sys'. –

+2

Спасибо @Matt. Здесь вы можете ничего редактировать. – Frank