この質問に答えるとき(そして同様の質問に対するこの答えを読んだとき)、私はPythonが正規表現をキャッシュする方法を知っていると思いました。
しかし、2つのシナリオを比較して、テストすると思いました。
- 単純な正規表現の単一のコンパイル、次にそのコンパイルされた正規表現の10個のアプリケーション。
- コンパイルされていない正規表現の10個のアプリケーション(正規表現を1回コンパイルしてからキャッシュし、キャッシュで9回検索する必要があるため、パフォーマンスがわずかに低下すると予想されていました)。
ただし、結果は驚異的でした(Python 3.3の場合)。
>>> import timeit
>>> timeit.timeit(setup="import re",
... stmt='r=re.compile(r"\w+")\nfor i in range(10):\n r.search(" jkdhf ")')
18.547793477671938
>>> timeit.timeit(setup="import re",
... stmt='for i in range(10):\n re.search(r"\w+"," jkdhf ")')
106.47892003890324
それは5.7倍以上遅いです!Python 2.7では、まだ2.5倍の増加があります。これも、私が予想していたよりも多い値です。
Python 2と3の間で正規表現のキャッシュが変更されましたか?ドキュメントはそれを示唆していないようです。