1

500MB のファイルを処理しています。re.searchを使用すると処理時間が増加しました。

私がテストした以下のケースを見つけてください。すべての場合において、ファイルを 1 行ずつ読み取り、if条件を 1 つだけ使用しています。

ケース1:

prnt = re.compile(r"(?i)<spanlevel level='7'>")
if prnt.search(line):
print "Matched"
out_file.write(line)
else:
out_file.write(line) 

ファイル全体を読み取るのに 16 秒かかりました。

ケース 2:

if re.search(r"(?i)<spanlevel level='7'>",line):
print "Matched"
out_file.write(line)
else:
out_file.write(line)

ファイルの読み取りに 25 秒かかりました。

ケース 3:

if "<spanlevel level='7'>" in line:
print "Matched"
out_file.write(line)
else:
out_file.write(line)

ファイルの読み取りにかかった時間はわずか 8 秒です。

3つのケースの違いを教えてください。Case3 は非常に高速に処理されていますが、大文字と小文字を区別しない一致を行うことができません。Case3 で大文字と小文字を区別しない一致を行う方法は?

4

1 に答える 1

4

最初にケース 3 の大文字と小文字を区別しない検索:

if "<spanlevel level='7'>" in line.lower():

を小文字lineにすることで、それを小文字検索にします。

ケース 2 が非常に遅い理由については、事前にコンパイルされた正規表現を使用すると、ファイルから読み取るすべての行の正規表現パターンのキャッシュ ルックアップを回避できるため、高速になります。フードの下では、キャッシュされたコピーがまだ存在しない場合re.search()にも呼び出され、その追加の関数呼び出しとキャッシュ チェックにコストがかかります。re.compile()

これは Python 3.3 では二重に苦痛であり、functools.lru_cacheデコレータを使用して新しいキャッシング モデルに切り替えましたが、これは実際には以前の実装よりも低速です。Python 3 でコンパイルされていない、繰り返し使用される正規表現が非常に遅いのはなぜですか? を参照してください。

を使用した単純なテキスト検索inは、完全に一致するテキストに対して高速です。正規表現は複雑なマッチングに最適です。大文字と小文字は区別されませんが、正確な一致を探しているだけです。

于 2013-03-18T16:26:10.413 に答える