Ric*_*kyB 6 performance for-loop r replicate
有没有人知道replicate()函数在R中是如何工作的以及它相对于使用for循环的效率如何?
例如,......之间是否存在效率差异?
means <- replicate(100000, mean(rnorm(50)))
Run Code Online (Sandbox Code Playgroud)
和...
means <- c()
for(i in 1:100000) {
means <- c(means, mean(rnorm(50)))
}
Run Code Online (Sandbox Code Playgroud)
(我可能在上面略微打了一些东西,但你明白了.)
Pau*_*tra 14
您可以对代码进行基准测试,并根据经验获得答案.请注意,我还添加了第二个for循环风格,它通过预分配向量来规避不断增长的向量问题.
repl_function = function(no_rep) means <- replicate(no_rep, mean(rnorm(50)))
for_loop = function(no_rep) {
means <- c()
for(i in 1:no_rep) {
means <- c(means, mean(rnorm(50)))
}
means
}
for_loop_prealloc = function(no_rep) {
means <- vector(mode = "numeric", length = no_rep)
for(i in 1:no_rep) {
means[i] <- mean(rnorm(50))
}
means
}
no_loops = 50e3
benchmark(repl_function(no_loops),
for_loop(no_loops),
for_loop_prealloc(no_loops),
replications = 3)
test replications elapsed relative user.self sys.self
2 for_loop(no_loops) 3 18.886 6.274 17.803 0.894
3 for_loop_prealloc(no_loops) 3 3.209 1.066 3.189 0.000
1 repl_function(no_loops) 3 3.010 1.000 2.997 0.000
user.child sys.child
2 0 0
3 0 0
1 0 0
Run Code Online (Sandbox Code Playgroud)
查看该relative列,未预分配的for循环速度慢6.2倍.但是,预分配的for循环速度与之一样快replicate.
replicate是一个包装器sapply,它本身就是一个包装器lapply.lapply最终是一个.Internal用C语言编写的函数,它以优化的方式执行循环,而不是通过解释器.它的主要优点是高效的内存管理,特别是与上面提到的高效低效的矢量增长方法相比.