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 界では常識なんでしょうね)
| 固定リンク
| コメント (0)
| トラックバック (0)




最近のコメント