Saturday, November 14, 2015

for文検索をやめて高速化

Excel VBA (僕が仕事でメインで使う言語だったり)やってて気がついたことをメモ程度に。
VBAでよくやるのが、目的の変数や文字列に一致するセルを見つけて...
という動作だと思うのですが、これがとにかく時間がかかります。
特に、検索対象の行や列が数万になったとたんにガクッと遅くなります。
探すときは

for i=1 to 25000
       if cells(i,1) = "mokuteki" then
             '何か動作
       end if
next i

こうやっている方が多いと思いますが、これが遅い。
調べてみるとMatchメソッドという便利なものがあるので、これを使いましょう。

WorksheetFunction.Match(<目的の変数>, <検索範囲>,0)

で、検索範囲のインデックス(行番号か、列番号)が返ってきます。
こりゃ便利。
上の例ですと
WorksheetFunction.Match("mokuteki", Range("A1:A25000"),0)
 とします。Rangeで範囲を指定します。


他の言語にも同様なものがあります。
セルではなく配列内($listと仮定します)での検索です。まずはPerl。
 grep { $list[$_] eq 'mokuteki' } 0 .. $#list;
 参照: http://www.koikikukan.com/archives/2015/01/22-005555.php

お次はPythonとRuby。
print list.index("mokuteki")
参照1: http://www.pythonweb.jp/tutorial/list/index10.html
参照2: http://ref.xaio.jp/ruby/classes/array/index

非常に簡単ですね...
今までプログラムの高速化はあまり意識していなかった(というか永遠のプログラミング初心者)
のですが、最近扱うデータの量が増えまして、
このような高速化を意識するようになりました。
こういう記事がシリーズ化できれば初心者を抜けられるかもしれませんね。

No comments: