加速包含R中的和的for循环

时间:2012-02-26 04:04:22

标签: r for-loop

我想知道是否可以修改此循环以更快地运行。当我以n = 2000000运行它时需要大约25秒。有什么技巧吗?

for(i in 1:n)
{
    x[i] <- sum(runif(20))
}

3 个答案:

答案 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次。