首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Replicate()还是for循环?

Replicate()还是for循环?
EN

Stack Overflow用户
提问于 2012-11-16 15:37:00
回答 4查看 5.5K关注 0票数 6

有人知道replicate()函数在R中是如何工作的吗?相对于使用for循环,它的效率有多高?

例如,在…之间有效率差异吗?

代码语言:javascript
复制
means <- replicate(100000, mean(rnorm(50)))

还有..。

代码语言:javascript
复制
means <- c()
for(i in 1:100000) { 
   means <- c(means, mean(rnorm(50)))
}

(我可能在上面输入了一些东西,但你明白我的意思。)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-16 16:34:28

您可以只对代码进行基准测试,并根据经验获得答案。请注意,我还添加了第二个for循环风格,它通过预分配向量来绕过不断增长的向量问题。

代码语言:javascript
复制
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一样快。

票数 14
EN

Stack Overflow用户

发布于 2012-11-16 15:47:00

replicatesapply的包装器,而which本身也是lapply的包装器。lapply最终是一个用C编写的.Internal函数,它以一种优化的方式执行循环,而不是通过解释器。它的主要优点是高效的内存管理,特别是与上面介绍的效率非常低的向量增长方法相比。

票数 8
EN

Stack Overflow用户

发布于 2016-04-26 01:33:51

我对replicate有一种非常不同的体验,这也让我感到困惑。与for相比,当我使用replicate时,我的R崩溃和笔记本电脑挂起的情况经常发生,这让我感到惊讶,因为上面提到的原因,我还希望一个C编写的函数比for循环性能更好。例如,如果您执行下面的函数,您将看到for循环比replicate更快

代码语言:javascript
复制
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的优势。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13412312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档