16

私の問題は、ログ ファイルを解析し、それらをグループ化するために各行の可変部分を削除することです。例えば:

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 で発生します。)

4

1 に答える 1