簡體   English   中英

神秘:為什么我添加和減去另一個變量時,data.table中的as.character()函數運行得更快?

[英]Mystery: Why does the as.character() function in a data.table run faster if I add and subtract another variable?

在將日期轉換為大型數據集的字符類時,我注意到了一些非常奇怪的東西。 作為一個例子,我創建了一個模擬數據集如下:

DT = data.table(x=rep("2007-1-1", 1e9), y = rep(1,1e9))
DT[,x] <- as.Date(DT[,x])

現在,我想將日期格式的x列轉換為字符。

DT[,x.character:= as.character(x)] 

這需要花費一些時間來處理大型數據集,我注意到如果我們執行以下操作,轉換所需的時間會急劇減少:

DT[,x.character:= as.character(x+y-y)]

我在這里做的只是添加y並減去y,所以我真的得到了相同的結果。 從邏輯的角度來看,似乎我正在讓計算機做更多的工作。 但是,為什么這種方法比直接轉換方式更快地運行?

為了便於說明,我使用system.time()運行了兩次10000行,並獲得了以下結果:

DT = data.table(x=rep(as.Date("2007-1-1"), 1e5), y = rep(1,1e5))

system.time(DT[,x.character:= as.character(x)]) 
> user  system elapsed 
1.89    0.12    2.03 

system.time(DT[,x.character:= as.character(x+y-y)]) 
> user  system elapsed 
0.635   0.008   0.643 

system.time(DT[,x.character.sub:= as.character(x+y-y+y-y)]) 
> user  system elapsed 
0.347   0.004   0.351 

我們可以看到,第二種方法所需的時間更少,更有趣的是,第三種方法,使用更多的yy方法,可以節省更多的時間。 有原因嗎?

謝謝!

在R會話期間第二次調用as.character時速度會更快,因為所有字符都已添加到全局緩存中。 添加和減去另一個變量是不相關的。

> library(data.table)
data.table 1.9.3  For help type: help("data.table")
> DT = data.table(x=rep(as.Date("2007-1-1"), 1e5), y = rep(1,1e5))
> system.time(DT[,x.character := as.character(x)]) 
   user  system elapsed 
  0.572   0.012   0.584 
> system.time(DT[,x.character := as.character(x)]) 
   user  system elapsed 
  0.389   0.008   0.397 
> system.time(DT[,x.character := as.character(x)]) 
   user  system elapsed 
  0.332   0.004   0.337 

為了進一步說明,這甚至與data.table沒有任何關系。 來自另一個新會議:

> x <- rep(as.Date("2007-1-1"), 1e5)
> system.time(as.character(x)) 
   user  system elapsed 
  0.529   0.008   0.537 
> system.time(as.character(x)) 
   user  system elapsed 
  0.312   0.012   0.324 
> system.time(as.character(x)) 
   user  system elapsed 
  0.327   0.008   0.335 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM