我对data.table
比较新,并且希望使用快速子设置功能来执行一些自举程序。
在我的例子中,我有两列100万个随机法线,我想取一些行的样本并计算两列之间的相关性。我希望在data.table网页上提出的速度提高速度提高了100倍...但也许我错过了使用data.table
......如果是这样,那么该函数的结构应该是什么样的?能够提高速度。
请参阅下面的示例:
n <- 1e6
set.seed(1)
q <- data.frame(a=rnorm(n),b=rnorm(n))
q.dt <- data.table(q)
df.samp <- function(){cor(q[sample(seq(n),n*0.01),])[2,1]}
dt.samp <- function(){q.dt[sample(seq(n),n*0.01),cor(a,b)]}
require(microbenchmark)
microbenchmark(median(sapply(seq(100),function(y){df.samp()})),
median(sapply(seq(100),function(y){dt.samp()})),
times=100)
Unit: milliseconds
expr min lq median uq max neval
median(sapply(seq(100), function(y) { df.samp() })) 1547.5399 1673.1460 1747.0779 1860.3371 2028.6883 100
median(sapply(seq(100), function(y) { dt.samp() })) 583.4724 647.0869 717.7666 764.4481 989.0562 100
答案 0 :(得分:1)
除了@Ddin的评论:
如果您对代码进行了分析,您会发现代价最高的重复函数调用是seq
(最多只需要一次)和sample
。
Rprof()
median(sapply(seq(2000), function(y) { dt.samp() }))
Rprof(NULL)
summaryRprof()
# $by.self
# self.time self.pct total.time total.pct
# "seq.default" 3.70 35.10 3.70 35.10
# "sample.int" 2.84 26.94 2.84 26.94
# "[.data.table" 1.84 17.46 10.52 99.81
# "sample" 0.34 3.23 6.90 65.46
# "[[.data.frame" 0.16 1.52 0.34 3.23
# "length" 0.14 1.33 0.14 1.33
# "cor" 0.10 0.95 0.26 2.47
#<snip>
更快的子集对此没有帮助。