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秒)。这就是使用dplyrdplyr
;我假设一个数据表解决方案可以再快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
多次的所有开销