私の問題は、ログ ファイルを解析し、それらをグループ化するために各行の可変部分を削除することです。例えば:
s = re.sub(r'(?i)User [_0-9A-z]+ is ', r"User .. is ", s)
s = re.sub(r'(?i)Message rejected because : (.*?) \(.+\)', r'Message rejected because : \1 (...)', s)
上記のような約120以上の一致ルールがあります。
100 の異なる正規表現を連続して検索しても、パフォーマンスの問題は見つかりませんでした。しかし、101 の正規表現を適用すると、大幅な速度低下が発生します。
ルールを次のように置き換えると、まったく同じ動作が発生します
for a in range(100):
s = re.sub(r'(?i)caught here'+str(a)+':.+', r'( ... )', s)
代わりに range(101) を使用すると、20 倍遅くなりました。
# range(100)
% ./dashlog.py file.bz2
== Took 2.1 seconds. ==
# range(101)
% ./dashlog.py file.bz2
== Took 47.6 seconds. ==
なぜそのようなことが起こっているのですか?そして、既知の回避策はありますか?
(Linux/Windows 上の Python 2.6.6/2.7.2 で発生します。)