R 计算循环内的平均值会降低性能

R 计算循环内的平均值会降低性能,r,performance,loops,R,Performance,Loops,考虑第一个例子: 它计算循环内的平均值 st <- Sys.time() #Starting Time set.seed(123456789) vara <- c() sda <- c() mvara <- c() #store mean msda <- c() #store mean of standard deviation K <- 100000 for(i in 1:K) { a <- rnorm(30) vara[i] <-

考虑第一个例子: 它计算循环内的平均值

st <- Sys.time() #Starting Time 
set.seed(123456789)
vara <- c()
sda <- c()
mvara <- c() #store mean
msda <- c() #store mean of standard deviation

K <- 100000

for(i in 1:K) {
  a <- rnorm(30)
  vara[i] <- var(a)
  sda[i] <- sd(a)
  mvara[i] <- mean(mvara)
  msda[i] <- mean(msda)
}

et <- Sys.time()

et-st  #time taken by code (approx more than one minute)
st <- Sys.time() #Starting Time 
set.seed(123456789)
vara <- c()
sda <- c()

K <- 100000

for(i in 1:K) {
  a <- rnorm(30)
  vara[i] <- var(a)
  sda[i] <- sd(a)
}

mvara <- cumsum(vara)/ (1:K)
msd <- cumsum(sda)/ (1:K)
et <- Sys.time()  #less than 5 seconds

stR在使用其内部优化代码执行循环时速度最快。我对其背后原因的理解很差(上面评论中的线索有知识渊博的人的解释),但我相信其中一些与内存预分配有关,还有一些与将问题转化为更有效的部分的方式有关

通过先创建所有随机数,然后立即求解整个表,而不是在循环中的这两个任务之间进行交换,您的“循环外”代码可以快20倍(在我的系统上,从7.17秒增加到0.43秒)。这就是使用dplyr
dplyr
;我假设一个
数据表
解决方案可以再快5-10倍,特别是考虑到大量的组

library(dplyr)
set.seed(123456789)
K <- 100000
n <- 30
a_df <- data.frame(trial = rep(1:K, each = 30),
                   val   = rnorm(K*n))

results <- a_df %>%
  group_by(trial) %>%
  summarize(vara = var(val),
            sda  = sd(val)) %>%
  mutate(mvara = cumsum(vara) / trial,
         msd   = cumsum(sda)  / trial)
库(dplyr)
种子集(123456789)

K不重复的可能重复项。我的问题很具体。两者都在使用循环。但第一种情况非常慢,而第二种情况则不然。重复说明了这一点:在第一种情况下,您分别调用
mean
函数100000次,而在第二种情况下,您调用
cumsum
函数,该函数经过优化,可以执行此操作,而无需调用
mean
多次的所有开销