2017-02-16 35 views
-1

我不喜歡dplyr和data.table在我的data.frame上創建一個新變量並決定比較方法。爲什麼在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.timeSys.time爲標杆很好的理由;從@ MattDowle的評論:

ⅰ)它首先從定時中排除的GC從隨機GC的分離和

ii)其包括usersys時間以及elapsed掛鐘時間。

Sys.time()方式將通過閱讀你的電子郵件在Chrome或在測試運行使用Excel受到影響,system.time()方式不會,只要你使用usersys部分結果。

+1

'system.time({...})'也好多了,因爲我做了一個gc,它首先排除了從隨機gc中分離出來的時間,並且ii)它也包括'user'和'sys'時間作爲'逝去的'掛鐘時間。 Sys.time()方式會受到在Chrome中讀取電子郵件或在測試運行時使用Excel(系統)的影響。time()'方法不會在你使用結果的'user'和'sys'部分的時候。 –

+2

謝謝@Matt。隨意在這裏編輯任何東西。 – Frank

相關問題