配列を宣言してから中身を入れると速い

R in a Nutshell」を読み進んでいます。第8章に、配列というのはあらかじめメモリを確保してから中身を入れた方が速いということが説明されています。

たとえば

create.vector.of.ones <- function(n) {
  return.vector <- NA;
  for (i in 1:n) {
    return.vector[i] <- 1;
  }
  return.vector;
}

に1行追加した

create.vector.of.ones.b <- function(n) {
  return.vector <- NA;
  length(return.vector) <- n;
  for (i in 1:n) {
    return.vector[i] <- 1;
  }
  return.vector;
}

のほうが実行時間が短くなります。これはRだけでなくMatlabでもCでも同じですね。ループの中でメモリ確保を繰り返し行うか、メモリ確保をあらかじめやっておくか、が速度の違いに影響してきます。

Matlabではループの中で行列を徐々に拡大していく手法を用いることも多いのですが、その方法だと上記のようにループ内でメモリ確保が繰り返される、積もり積もって遅いプログラムになります。単純なことですが、気をつけないと行けないですね。