在R中使用向量而不是循环

时间:2014-07-29 04:02:59

标签: r vector vectorization

考虑以下简化循环

value<-rep(NA,100000)

system.time(for (i in 1:100000) {
  x <- rnorm(600,0,1) 
  value[i]<- mean(x) 
})

   user  system elapsed
  6.839   0.184   7.025 

我们如何使用向量优化此循环?是否有可能让它运行得更快?

我知道有类似的帖子,比如Using vectors instead of loops,但我的问题在随机抽签的位置上有点不同。

1 个答案:

答案 0 :(得分:0)

循环并没有花费太多时间。调用rnorm来制作单个向量,以后使用动态包rollmean的部分方法要慢得多。

value<-rep(NA,100000)
system.time(for (i in 1:100000) {
  x <- rnorm(600,0,1) 
  value[i]<- mean(x) 
})
user  system elapsed 
8.873   0.020   8.905 

system.time(y <- rnorm(600*100000,0,1))
 user  system elapsed 
6.748   0.112   6.874

x<-rep(NA,100000)
system.time(for (i in 1:100000) {
  x <- rnorm(600,0,1) 
})
 user  system elapsed 
7.116   0.020   7.150 

value<-rep(NA,100000)
system.time(for (i in 1:100000) {
  value[i]<- mean(x) 
})
 user  system elapsed 
0.924   0.000   0.924 

Ananda在评论中的想法提供了一个非常相似的循环时间。

system.time(x <- colMeans(matrix(rnorm(600*100000, 0, 1), ncol = 100000)))
 user  system elapsed 
7.873   0.232   8.119