ループのスピードアップ
Rのループを (しかたなく) 使うときに.
このあたりのエントリを参考にしました.
Another aspect of speeding up loops in R (me nugget)
How to speed up loops in R (Revolutions)
例1のように,まわすたびにオブジェクトのサイズが変わっていくようなループでは,そのたびごとに新たなメモリを確保する必要があるため,パフォーマンスが極端に低下します.
その一方,例2のように,最初に大きなオブジェクトを指定して,その中に値を代入していくようなループなら,極端な速度低下を防ぐことができます.
代入していくオブジェクトのサイズがわからなければ,例3のようにlistに入れていけば良いとか.
…基本中の基本ですが,パフォーマンスが100-150倍くらい向上したのには驚きました.
例4では,同じことをsapply関数を使ってやっていますが,やはりこちらも早いですね.
nrow <- 100 ncol <- 5000
例1
x.bind <- rnorm(nrow) system.time( for(i in 2:ncol){x.bind <- cbind(x.bind, rnorm(nrow))} ) ユーザ システム 経過 28.474 11.258 40.090
例2
x.array <- array(0, dim = c(nrow, ncol)) system.time( for(i in 1:ncol){x.array[ , i] <- rnorm(nrow)} ) ユーザ システム 経過 0.306 0.003 0.308
例3
x.list <- list(rnorm(nrow)) system.time( for(i in 2:ncol){x.list[[i]] <- rnorm(nrow)} ) ユーザ システム 経過 0.475 0.017 0.492
例4
x.apply <- rep(nrow, ncol) system.time( x.apply <- sapply(x.apply, rnorm) ) ユーザ システム 経過 0.290 0.006 0.294