うーん。変ですね。これまでの私の知識 (他の情報源の中でも、この質問から得られたもの) は、私の最初の答えを示唆しています。
最初の答え
Python は、使用した最後の 100 個の正規表現をキャッシュするため、それらを明示的にコンパイルしなくても、使用するたびに再コンパイルする必要はありません。
ただし、2 つの欠点があります。100 個の正規表現の制限に達すると、キャッシュ全体が削除されるため、101 個の異なる正規表現を続けて使用すると、毎回それぞれが再コンパイルされます。まあ、それはかなりありそうもないですが、それでも.
次に、正規表現がすでにコンパイルされているかどうかを調べるために、インタープリターは毎回キャッシュ内の正規表現を検索する必要がありますが、これには少し余分な時間がかかります (ただし、辞書検索は非常に高速であるため、それほど時間はかかりません)。
したがって、正規表現を明示的にコンパイルすると、この余分な検索手順を回避できます。
アップデート
私はいくつかのテストを行いました(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
したがって、キャッシュが行われていないように見えます。おそらく、それtimeit.timeit()
は実行される特別な条件の癖でしょうか?
一方、Python 2.7 では、違いはそれほど目立ちません。
>>> import timeit
>>> timeit.timeit(setup="import re", stmt='''r=re.compile(r"\w+")\nfor i in range(10):\n r.search(" jkdhf ")''')
7.248294908492429
>>> timeit.timeit(setup="import re", stmt='''for i in range(10):\n re.search(r"\w+"," jkdhf ")''')
18.26713670282241