- ベストアンサー
indexと正規表現、どちらが早い?ファイルから特定の文字を検索する方法
- 30ファイルあるテキストファイルから特定の文字にマッチする行を調べたい。確認したい文字列の長さは10-20文字。perlを使って検索する場合、index関数と正規表現のどちらが効率的なのか疑問。
- ファイルはアルファベットで構成され、各行の末尾は改行で区切られている。スペースは含まれていない。3-5GB程度の大きさ。
- 他に良い方法やモジュールがあれば教えてほしい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
適当な事言わずにuse Benchmark qw(timethese cmpthese);。 a-zA-Zのランダム一行40字、100万行(40MB)を indexとregexで検索文字列15字にマッチした行をカウント、 これをそれぞれ100回実行したところ、大差なし。 僅かに正規表現の方が早いですね。 ちなみにregqrは、$search_word = qr/hoge/を使ったものです。 index: 83 wallclock secs (78.55 usr + 4.34 sys = 82.89 CPU) @ 1.21/s (n=100) regex: 75 wallclock secs (72.00 usr + 3.53 sys = 75.53 CPU) @ 1.32/s (n=100) regqr: 74 wallclock secs (69.78 usr + 3.62 sys = 73.41 CPU) @ 1.36/s (n=100) Rate index regex regqr index 1.21/s -- -9% -11% regex 1.32/s 10% -- -3% regqr 1.36/s 13% 3% --
その他の回答 (3)
- kuroizell
- ベストアンサー率55% (95/170)
ちょっと気になったので、追記しておきます。 index関数との比較ということで、固定された検索ワードと理解しています。 従って、私の取ったベンチは、$str =~ /hoge/のようなリテラルでのパターンマッチ速度です。 正規表現というのは本来 /^[a-fA-F]{4}\d{2,10}.+$/のようなもので、 単純に$str =~ /h.{2}e/としただけでも、indexの方が早くなってきます。
お礼
補足の説明をありがとうございます。 今回の解析では、固定された検索ワードで検索するだけでしたので、ANo.2の回答で問題ありません。 気遣いありがとうございました。
- kuroizell
- ベストアンサー率55% (95/170)
いや、一割早ければ大差ある・・・・かな? 私のマシンなら、30ファイル全部やって41分→37分になる計算。 やっぱり大差ないか。
お礼
40分のうちの4分程度の差でしたら、ずっとパソコンの前に座っているわけでもないので、あまり変わらない印象ですね。
- SAYKA
- ベストアンサー率34% (944/2776)
単純に考えたら 挙動が単純なindexに部があるね。 スペースの無いアルファベットのみっていうのが曲者だと思うけれど、複雑になればなるほど処理に時間がかかるから、より単純な探索のindexがどんどん有利になると思うよ。 ただ、ちょっと複雑な「置換」となると 想定の置換数と文字の長さで変わってくるんじゃないかな。
お礼
回答ありがとうございます。 やはり、そうですよね。 どのくらい違うのかが気になります。
お礼
回答ありがとうございます。 疑問が解決しました。 indexの方が早いとは予測していたのですが、思っていたほど違いはないんですね。これだったら、より柔軟に文字列を設定できる正規表現を使おうかと思います。 ありがとうございました。