【发布时间】:2019-07-15 15:09:29
【问题描述】:
考虑第一个例子: 它计算循环内的平均值。
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
我只是想知道,为什么两种代码的性能差异如此之大?使用循环时应该注意哪些地方?
【问题讨论】:
-
不重复。我的问题非常具体。两者都使用循环。但是第一个非常慢,而第二个则不是。
-
副本解释了它:在第一种情况下,您调用
mean函数 100,000 次,而在第二种情况下,您调用cumsum函数,该函数经过优化以执行此操作而无需所有多次调用mean的开销
标签: r performance loops