裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

無駄をなくし,短くすると,速くなる(本当か?)

2014年05月16日 | ブログラミング

コーパス間で頻度差の大きい単語を特定する」だが...
http://t.co/aTOkCabdnT

少なくとも,mat3 への代入文は for ループの外に出さないといけない
(ソースフォーマットが悪い(ない)ので,自分で気づけない)
fisher.bat = function(x) {
    sum = apply(x, 2, sum)
    nr = nrow(x)
    nc = ncol(x)
    mat = matrix(0, nr, 1)
    mat2 = cbind(x, p.value = mat)
    for (i in 1:nr) {
        temp = rbind(x[i, ], sum - x[i, ])
        mat2[i, nc + 1] = fisher.test(temp)$p.value
        mat3 = mat2[sort.list(mat2[, nc + 1]), ]
    }
    list(results = mat3)
}

for をなくすと共に,いろいろと無駄をなくしてみる
fisher.bat2 = function(x) {
    sum = colSums(x)
    y = t(sum - t(x))
    p.values = apply(cbind(x, y), 1, function(temp) fisher.test(matrix(temp, 3))$p.value)
    cbind(x, p.values)[order(p.values), ]
}

速くなったようだ
> system.time(fisher.bat(nouns))
   ユーザ   システム       経過  
     0.449      0.017      0.463
> system.time(fisher.bat2(nouns))
   ユーザ   システム       経過  
     0.165      0.012      0.175

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村