[英]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.