为什么data.table行索引的for循环比data.frame慢?

use*_*662 6 indexing r dataframe data.table

我肯定很困惑为什么按行索引访问data.table比data.frame慢.任何建议如何我可以在循环中顺序访问每一行data.table更快?

m = matrix(1L, nrow=100000, ncol=100)

DF = as.data.frame(m)
DT = as.data.table(m)

identical(DF[100, ], DT[100, ])
[1] FALSE

> all(DF[100, ], DT[100, ])
[1] TRUE

> system.time(for (i in 1:1000) DT[i,])
   user  system elapsed 
  5.440   0.000   5.451 

R> system.time(for (i in 1:1000) DF[i,])
   user  system elapsed 
  2.757   0.000   2.784 
Run Code Online (Sandbox Code Playgroud)

Bro*_*ieG 6

一个data.table查询有更多的参数(并且它做得更多)所以小开销DT[...]大于DF[...].如果你循环它,这个开销就会增加.预期的用途data.table是让它执行几次大型复杂操作,而不是多次执行小的平凡计算.那么让我们重新制定你的测试:

> system.time(DT[seq(len=nrow(m)),])
 user  system elapsed 
0.08    0.02    0.09 
> system.time(DF[seq(len=nrow(m)),])
 user  system elapsed 
0.08    0.05    0.13 
Run Code Online (Sandbox Code Playgroud)

在这里,它们大致相同.由于我们只有一个DT调用,因此开销不是那么明显,因为开销只执行一次.在你的情况下,你执行了100K次(不必要的,我可能会添加).如果您正在使用data.table并且您正在拨打它数千次,那么您可能错误地使用了它.几乎可以肯定有一种方法可以重新制定,这样你就可以只进行一次或几次data.table调用.

另外,请注意,即使我在此重新制定的测试也非常简单,这就是为什么data.table表现相当data.frame.