« kobo touch の microSD で日本語ファイル名 | トップページ | Xcode license agreements »

2013年5月27日 (月曜日)

Python の正規表現が激遅だと思ったら

仕事で書いてた perl のスクリプトを python で書きなおした時に少しだけハマったのでメモ。

問題のスクリプトは100MBくらいのテキスト(ログ)を解析して結果を出力するモノですが、処理に 10 分弱もかかるようになってしまいました。 perl で書いてた時の処理時間はちゃんと測定してませんが、明らかに劇的に遅くなってます。
そこでドキュメントなどを参考に、 python 標準のツールで超簡単にプロファイリングしてみました。
プロファイリング対象のスクリプト my-script.py は標準入力から処理対象のテキストを入力し、複数の引数をとるので、下記のようなコマンドラインで python のプロファイラ cProfile.py を実行しました。

cat input-log-file | cProfile.py -o prof-result-file my-script.py script-arg1 script-arg2

cProfile.py は python の lib フォルダにあります。(例えば Cygwin の python 2.7 の場合 /usr/lib/python2.7/cProfile.py)

上記コマンドで得られるプロファイル結果 prof-result-file は、下記の様なスクリプトでソートして時間を食ってそうな処理を探しました。(ドキュメントまんま)

import pstats
p = pstats.Stats('prof-result-file')
p.sort_stats('cumulative').print_stats(10)

結果、どうも正規表現オブジェクトのコンパイルと search メソッドに殆どの時間が費やされていたようなので、正規表現オブジェクトを予めコンパイルしておくことと、正規表現のマッチング時に可能な限り search に代えて match を使うことで処理時間を約 1/3 にすることができました :-)

因みに、元のコードではループ処理中に re.search メソッドを多用していました。(こことかここなどご参考)

以後、気をつけます。(…って python 界では常識なんでしょうね)

|

« kobo touch の microSD で日本語ファイル名 | トップページ | Xcode license agreements »

スクリプティング」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/144752/57453153

この記事へのトラックバック一覧です: Python の正規表現が激遅だと思ったら:

« kobo touch の microSD で日本語ファイル名 | トップページ | Xcode license agreements »