this questionと答えると(そして同様の質問にthis answerを読んだ)、私はPythonが正規表現をどのようにキャッシュしているかを知っていると思っていました。Python 3では、コンパイルされず、繰り返し使用される正規表現が非常に遅いのはなぜですか?
は、しかし、私は、私は2つのシナリオを比較し、それをテストしようと思いました:
- 簡単な正規表現の単一のコンパイル、コンパイル済み正規表現の後、10のアプリケーション。
- 10個のコンパイルされていない正規表現のアプリケーション(ここで正規表現は一度コンパイルしてからキャッシュに入れてから、キャッシュで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の間でregexesのキャッシュが変更されていますか? The docsはそれを示唆していないようです。
ええ、なぜあなたは 'timeit'をそのように使っていますか?なぜ 'stmt = 're.search(...)'' /'stmt='r.search(...) ''' re.compile'を 'setup'に追加するのですか? – delnan
ファンシーな 'functools.lru_cache'がここで問題になります。それはあなたの後のキャッシュの変更です。また、http://bugs.python.org/issue16389を参照してください。 – mmgp
@delnan:私はタイミングの一部である正規表現の編集をしたかったのです。 –