16

re.matchモジュールをre.search使用して比較しようとしたtimeitところ、見つけたい文字列が文字列の先頭にある場合、検索よりも一致が優れていることがわかりました。

>>> s1 = '''
... import re
... re.search(r'hello','helloab'*100000)
... '''
>>> timeit.timeit(stmt=s1,number=10000)
32.12064480781555


>>> s = '''
... import re
... re.match(r'hello','helloab'*100000)
... '''
>>> timeit.timeit(stmt=s,number=10000)
30.9136700630188

今、私は一致が文字列の先頭にあるパターンを探し、見つかった場合はオブジェクトを返すことを認識していますが、検索がどのように機能するのか疑問に思っています。

文字列が最初に見つかった後、検索は余分なマッチングを実行し、速度が低下しますか?

アップデート

@David Robinsons コードを使用した後、彼と同様の結果が得られました。

>>> print timeit.timeit(stmt="r.match('hello')",
...              setup="import re; s = 'helloab'*100000; r = re.compile('hello')",
...              number = 10000000)
49.9567620754
>>> print timeit.timeit(stmt="r.search('hello')",
...              setup="import re; s = 'helloab'*100000; r = re.compile('hello')",
...             number = 10000000)
35.6694438457

それで、更新された質問は、なぜsearchパフォーマンスが優れているのmatchかということです。

4

2 に答える 2

6

私のマシン(Mac OS10.7.3のPython2.7.3、1.7 GHz Intel Core i5)では、文字列の構築、reのインポート、および正規表現のコンパイルをセットアップで完了し、10回ではなく10000000回の反復を実行すると、反対:

import timeit

print timeit.timeit(stmt="r.match(s)",
             setup="import re; s = 'helloab'*100000; r = re.compile('hello')",
             number = 10000000)
# 6.43165612221
print timeit.timeit(stmt="r.search(s)",
             setup="import re; s = 'helloab'*100000; r = re.compile('hello')",
            number = 10000000)
# 3.85176897049
于 2012-10-09T15:55:35.853 に答える