Python で正規表現に compile を使用すると何か利点がありますか?
h = re.compile('hello')
h.match('hello world')
対
re.match('hello', 'hello world')
ベストアンサー1
私は、コンパイルされた正規表現を 1000 回実行した場合とオンザフライでコンパイルした場合とで多くの経験を積んできましたが、目に見える違いは見つかりませんでした。もちろん、これは逸話的な話であり、コンパイルに反対する大きな議論ではありませんが、その違いはごくわずかであることがわかりました。
編集: 実際の Python 2.5 ライブラリ コードをざっと見たところ、Python は正規表現を使用するたびに ( の呼び出しを含むre.match()
) 内部的に正規表現をコンパイルしてキャッシュすることがわかりました。そのため、正規表現がコンパイルされるタイミングを変更するだけで、時間はほとんど節約されません。節約できるのはキャッシュの確認 (内部型のキー検索) にかかる時間だけですdict
。
モジュール re.py より (コメントは私によるものです):
def match(pattern, string, flags=0):
return _compile(pattern, flags).match(string)
def _compile(*key):
# Does cache check at top of function
cachekey = (type(key[0]),) + key
p = _cache.get(cachekey)
if p is not None: return p
# ...
# Does actual compilation on cache miss
# ...
# Caches compiled regex
if len(_cache) >= _MAXCACHE:
_cache.clear()
_cache[cachekey] = p
return p
私は今でも正規表現を事前コンパイルすることがよくありますが、それはパフォーマンスの向上を期待するためではなく、それらを適切で再利用可能な名前にバインドするためだけです。