有人知道replicate()函数在R中是如何工作的吗?相对于使用for循环,它的效率有多高?
例如,在…之间有效率差异吗?
means <- replicate(100000, mean(rnorm(50)))还有..。
means <- c()
for(i in 1:100000) {
means <- c(means, mean(rnorm(50)))
}(我可能在上面输入了一些东西,但你明白我的意思。)
发布于 2012-11-16 16:34:28
您可以只对代码进行基准测试,并根据经验获得答案。请注意,我还添加了第二个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 查看relative列,未预分配的for循环要慢6.2倍。但是,预分配的for循环与replicate一样快。
发布于 2012-11-16 15:47:00
replicate是sapply的包装器,而which本身也是lapply的包装器。lapply最终是一个用C编写的.Internal函数,它以一种优化的方式执行循环,而不是通过解释器。它的主要优点是高效的内存管理,特别是与上面介绍的效率非常低的向量增长方法相比。
发布于 2016-04-26 01:33:51
我对replicate有一种非常不同的体验,这也让我感到困惑。与for相比,当我使用replicate时,我的R崩溃和笔记本电脑挂起的情况经常发生,这让我感到惊讶,因为上面提到的原因,我还希望一个C编写的函数比for循环性能更好。例如,如果您执行下面的函数,您将看到for循环比replicate更快
system.time(for (i in 1:10) runif(1e7))
# user system elapsed
# 3.340 0.218 3.558
system.time(replicate(10, runif(1e7)))
# user system elapsed
# 4.622 0.484 5.109因此,使用10复制时,for循环明显更快。如果你重复100次,你会得到类似的结果。所以我想知道是否有人能拿出一个例子来展示它与for相比的实用的特权。
我还为runif(1e7)创建了一个函数,这在比较中没有什么不同。基本上,我没有提供任何示例来展示replicate的优势。
https://stackoverflow.com/questions/13412312
复制相似问题