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