Efficient Programming in S-PLUSを訳してみる

Efficient Programming in S-PLUSをばっと訳しつつ(正確にはしない)、まとめて勉強してみるテスト。間違っているところがあったら指摘してもらえると助かります。

S-PLUSって書いてあるけど、たぶんほとんどRについても言えることだと思います。

ベクトル、ベクトル、ベクトル!!

rjpwikiにも書いてある「意味のある時にはベクトルを、そうでないときでもベクトルを」ってやつですね、分かります。とにかくループを使うのは避けましょう。ベクトルに関して便利な関数には例えばこういうのがあります。

  • rep()
  • colSums(), rowSums(), (and *Means, *Vars, ...)
  • cumsum, cumprod, cummax, cummin
  • ifelse
  • x[some elements] <- value
  • outer() (requires vectorized function)
  • any(), all(), | and & (vectorized versions of || and &&)
  • pmin(), pmax()
  • cut(), table(), tabulate()
  • match(), match.data.frame(), is.element(),
  • approx()
  • order, sort.list(..., partial), sort(..., partial)
  • which(), "%%",
  • call, do.call

あと乱数生成はちまちまと生成するより、一度に生成したほうがよいとのことです。ああ、そういえばMCMCの時もそういう風にしたほうが早かったかなあと今では思う。

ベクトル化できない時は?

リストに関してはlapply、データフレームに関してはapplyを使うようにしましょう。また、ループの外に出せる処理はループの外に出すようにしよう。

(計算が)早いオブジェクトを使おう

  • データフレームは遅いです。行列やベクトルをなるべく使うようにしましょう(今度試す)。
  • データフレームでは$でアクセスするようにしましょう(知らなかった)。[]や[j]、[,j]といった表現より早くなります
  • pull vectors out of a larger object
    • ベクトルを大きなオブジェクトから引き上げる…?
  • ベクトルの行に名前を付けるのは止めよう
    • names(vector)で出てくるやつ
  • 欠損値に気をつけよう
    • あると遅くなる?

早い関数を使おう

  • 内部で.Internalを使っているような関数とか
  • ベクトル化されているような関数とか
  • 自分の関数もベクトル化できるように書こう
  • recursion; avoid, or small argument lists
    • よく分からない。再帰のほうがいい?

その他もろもろ

  • 計算したものは使い回そう
  • avoid writing to frame 0 or 1 repeatedly
    • データフレームのこと?
  • save intermediate results only occasionally
    • 中間オブジェクトはたまにしか保存しないようにしよう?
    • ん、意味がよく分からない
  • use utilities for checking time and memory
    • 時間やメモリーをチェックするのに、utilityをうまいこと使おう
  • コードのレビューをちゃんとしよう

効率性が大きな問題となるとき

  • 関数呼び出しをなるべく避けよう
  • pull out the guts of functions you are calling
    • んー、よく分からない
  • 既存のCのコードを使おう
  • avoid error-checking in interior functions
  • avoid memory growth, use For() loops
  • call new C code


とちゅうううううううううううう