Ускорение цикла for, содержащего сумму в R - PullRequest
2 голосов
/ 26 февраля 2012

Мне интересно, возможно ли изменить этот цикл, чтобы он работал быстрее? Когда я запускаю его с n = 2000000, это занимает около 25 секунд. Какие-нибудь хитрости доступны?

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

Ответы [ 3 ]

4 голосов
/ 26 февраля 2012
system.time(x <- rowSums(matrix(runif(2e6),ncol=20)))
#   user  system elapsed 
#  0.108   0.620   0.748 
2 голосов
/ 26 февраля 2012

Использование 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

Цикл длится дольше, чем применяется.

0 голосов
/ 26 февраля 2012

Я бы предпочел следующее решение:

x <- rep(sum(runif(20)), 2e6)

РЕДАКТИРОВАТЬ: Извините, я понимаю, что вы получите тот же номер 2e6 раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...