在将日期转换为大型数据集的字符类时,我注意到了一些非常奇怪的东西.举个例子,我创建了一个模拟数据集,如下所示:
DT = data.table(x=rep("2007-1-1", 1e9), y = rep(1,1e9))
DT[,x] <- as.Date(DT[,x])
Run Code Online (Sandbox Code Playgroud)
现在,我想将日期格式的x列转换为字符.
DT[,x.character:= as.character(x)]
Run Code Online (Sandbox Code Playgroud)
这需要花费一些时间来处理大型数据集,我注意到如果我们执行以下操作,转换所需的时间会急剧减少:
DT[,x.character:= as.character(x+y-y)]
Run Code Online (Sandbox Code Playgroud)
我在这里做的只是添加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
Run Code Online (Sandbox Code Playgroud)
我们可以看到,第二种方法所需的时间更少,更有趣的是,第三种方法,使用更多的yy方法,可以节省更多的时间.有原因吗?
谢谢!
Jos*_*ich 13
as.character在R会话期间第二次调用时速度会更快,因为所有字符都已添加到全局缓存中.添加和减去另一个变量是不相关的.
> 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
Run Code Online (Sandbox Code Playgroud)
为了进一步说明,这甚至与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
Run Code Online (Sandbox Code Playgroud)