1. ホーム
  2. python

[解決済み] Pythonのre.compileは使う価値があるのか?

2022-03-17 05:55:57

質問

Pythonの正規表現にコンパイルを使用するメリットはありますか?

h = re.compile('hello')
h.match('hello world')

re.match('hello', 'hello world')

解決方法は?

私は、コンパイルした正規表現を何千回も実行するのと、オンザフライでコンパイルするのを何度も経験しましたが、目に見える違いは感じられませんでした。 もちろん、これは逸話的なものであり、大きな議論にはなりません。 反対 しかし、その差はごくわずかであることがわかりました。

EDIT 実際の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

私は今でもよく正規表現をプリコンパイルしますが、それは再利用可能な素敵な名前にバインドするためだけで、パフォーマンスの向上を期待しているわけではありません。