- ベストアンサー
split と 正規表現による分割
http://oshiete1.goo.ne.jp/kotaeru.php3?q=964020 にて同じような質問をしたのですが、ご回答と自分での検証で食い違いが起きたので質問させていただきます。 splitを用いた分割と正規表現を用いた分割のどちらが速いかというものです。 #####test.txt### ... <!--line--> ... <!--line--> .... ################ というファイルを$lineという変数に入れ、 ********************************************** sub seiki { my $a,$b,$c; if($line=~ /(.*)<!--line-->\n(.*)<!--line-->\n(.*)/s){ $a=$1; $b=$2; $c=$3; } ********************************************** と ********************************************** sub split { my($a,$b,$c){split("<!--line-->\n",$line);} } ********************************************** をBenchmarkモジュールを用いて、速度比較をしてみたところ、splitの方が4倍程速い結果が出ました。実際に用いたtest.txtのサイズは10KBです。 前回質問したときのご回答では、正規表現のほうが早いというご意見をいただいたのですが、本当のところはどちらなのでしょうか
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> この場合のsplitはどのような正規表現を使っているのでしょうか? こればかりはPerlの中身を見てみないと分かりません。 > splitで使われているような正規表現をすれば、正規表現だけで書いた方が速くなるということでしょうか。 splitの実体は、Cなどで書かれたライブラリです。Perlで同じ正規表現、同じアルゴリズムでコードを書いても、速度で上回ることはないでしょう。 前回はあくまで「分割」ではなく「部分取り出し」として捉えることができ、かつ正規表現でも十分な速度が期待できる文字列長だったので、その手の問題ならば正規表現に分があるということを書いたわけです。
その他の回答 (2)
- leaz024
- ベストアンサー率75% (398/526)
> http://oshiete1.goo.ne.jp/kotaeru.php3?q=964020 > にて同じような質問をしたのですが、ご回答と自分での検証で食い違いが起きたので質問させていただきます。 今回と前回では、問題の質が違いますよね。 前回の回答を得た後、その問題では検証しなかったのでしょうか? 文字列の中から特定の部分を抜き出すのと、テキストファイルをマーク行を境に分割するのでは、随分勝手が違いますし当然アプローチも変わります。 正規表現は複雑になるほど、また対象文字列が長くなるほど重くなりますし、「分割」といったら split を使うのが普通です。 前回のケースは対象文字列も短かった上、「分割」というより「部分取り出し」に近かったので、正規表現でのアプローチも十分に考えられたし効果的でした。 しかし、今回のケースはファイル全体が対象の上、完全に「分割」です。正規表現を持ち出す余地は鼻からありません。
お礼
前の質問は、今回質問した内容を自分で勝手に簡易化して質問してしまっていたので、前回のアドバイスしていただいたソースをそのまま使っては検証していませんでした。なので検証は、今回のテキストファイルから文字列を読み込んで分割して取得する方法でしか試していませんでした。 なるほど、文字列が長くなると処理が重くなってしまうのですね、知りませんでした。。 ただ、ごめんなさい、まだもやもやが取れないので質問させてください。 無謀な質問かもしれませんが、前回のご解説の中に「splitは正規表現を使って分割を行っている」という指摘を受けたのですが、この場合のsplitはどのような正規表現を使っているのでしょうか?splitで使われているような正規表現をすれば、正規表現だけで書いた方が速くなるということでしょうか。すこし頭がこんがらがっています^^;もしよろしければ、これについてアドバイスをお願いしますm(_ _;)m
- naoto0314
- ベストアンサー率34% (25/73)
my $a,$b,$c; if($line=~ /(.*)<!--line-->\n(.*)<!--line-->\n(.*)/s){ $a=$1; $b=$2; $c=$3; 上の方は行数も多く、splitよりも処理が複雑なので遅くなったのではないのでしょうか?
お礼
なるほど..やはりそうなのですね。 しかしsplit関数も正規表現を使って分割を行うとのことで、実際にどのような動作を行っているのかが気になります・・。
お礼
詳しくご解説して頂き、ありがとうございました。 >>splitの実体は、Cなどで書かれたライブラリです。Perlで同じ正規表現、同じアルゴリズムでコードを書いても、速度で上回ることはないでしょう。 そうだったのですか、Perlといえども、C等のようなコンパイル済みの処理には勝てないということですね、これですっきり解決できました。またよろしくお願いします。