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
とちゅうううううううううううう