ループのスピードアップ

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