繁体   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