我想知道是否可以修改此循环以更快地运行。当我以n = 2000000运行它时需要大约25秒。有什么技巧吗?
for(i in 1:n)
{
x[i] <- sum(runif(20))
}
答案 0 :(得分:4)
system.time(x <- rowSums(matrix(runif(2e6),ncol=20)))
# user system elapsed
# 0.108 0.620 0.748
答案 1 :(得分:2)
使用apply可以提高你的速度。
# How many rows?
n <- 1000
# How many samples from runif?
k <- 20
# Preallocate x
x <- double(n)
## Your loop
for(i in 1:n){
x[i] <- sum(runif(k))
}
## Using apply
## First create a matrix that has n rows and k columns
## then find the sum of the row.
x <- apply(matrix(runif(n*k), nrow=n), 1, sum)
现在测试速度:
benchmark(
loop = expression(
for(i in 1:n){
x[i] <- sum(runif(k))
}
),
apply = expression(
x <- apply(matrix(runif(n*k), nrow=n), 1, sum)
)
)
# Result of benchmark
#
# test replications elapsed relative user.self sys.self user.child sys.child
#2 apply 100 1.08 1.000000 1.06 0.00 NA NA
#1 loop 100 1.69 1.564815 1.63 0.02 NA NA
循环花费的时间比申请时间长。
答案 2 :(得分:0)
我更喜欢以下解决方案:
x <- rep(sum(runif(20)), 2e6)
编辑:对不起,我知道你会得到相同的号码2e6次。