実際に計測してみると良いです。
コンパイルを行わないで100回マッチングを試みます。
前以てコンパイルしたパターンを用い、100回マッチングを試みます。
100回、コンパイルしてからマッチングします。
Python
1import re
2import timeit
3
4
5def func1():
6 for _ in range(100):
7 re.search(r'\d+', 'hoge123fuga')
8
9def func2():
10 regex = re.compile(r'\d+')
11
12 for _ in range(100):
13 regex.search('hoge123fuga')
14
15def func3():
16 for _ in range(100):
17 regex = re.compile(r'\d+')
18 regex.search('hoge123fuga')
19
20
21for func in [func1, func2, func3]:
22 print(func)
23 print(timeit.timeit(lambda: func(), number=10000))
実行結果 Wandbox
stdout
1<function func1 at 0x7f8602783e18>
21.799713782966137
3<function func2 at 0x7f86012d0950>
40.7829366624355316
5<function func3 at 0x7f86012d09d8>
61.7352472953498363
ある程度測定誤差は出ますが、 func2 < func1 ≒ func3 であることが分かります。
re.compileを使わなかったときも、実際には内部的にコンパイルが走っています。
それはfunc1とfunc3の実行時間がほとんど同じことからも明らかです。
ですので、単発で使う正規表現をわざわざコンパイルするメリットはほとんどありません。
別に多く使わないならre.compileを積極的に使う必要はない。
この主張は概ね正しいように思います。
追記
私の説明が厳密にはリファレンスに反することに気付きました。
re.compile() に渡されてコンパイルされた最新のパターンと、モジュールレベルのマッチング関数はキャッシュされるので、一度に少しの正規表現しか使わないプログラムは正規表現のコンパイルについて心配する必要はありません。
引用元: Python 標準ライブラリ » re — 正規表現操作
実測したコードで用いた一種類の正規表現は、この説明に依るとキャッシュされている筈です。
ですので、実行時間の差は正規表現のコンパイルそれ自体に依るものでは無く、
キャッシュの検索、つまりre.compileの呼び出しが影響しているのだと考えられます。
『直前にre.compileを潜らせるメリットは薄い』と言う本筋の主張には変わりないです。
コンパイル型言語とインタプリタ型言語
特に初心者向けの説明で散見する表現ですが、個人的には適切ではない分類方法だと思います。
まず、「コンパイラ言語」「スクリプト言語」というのは俗称であって、正式な分類ではありません。確かに、「コンパイル型として実装されることが多い言語」「インタプリタで実装されることが多い言語」というのがありますが、それはあくまで相対的なものでしかありません。
teratail - コンパイル言語とスクリプト言語の違い - maisumakunさんの回答
近年の開発環境などでは、コンパイル(ビルド)して実行、というような手続きを1命令で行えるものも増えている。そして、インタプリタでも実行時コンパイラなどの技術の利用がさかんになってきており、古典的な意味での「コンパイラ」と「インタプリタ」の中間的な性質のツール(プログラム)も増えてきているので、「コンパイラ言語 / インタプリタ言語」という、以前よく行われた対比は、あまり意味を持たない場合も増えてきている。
Wikipedia - コンパイラ
コンパイルという言葉の持つ意味が広すぎるので、
単に『前以てちょっと処理してるんだなぁ』くらいの感覚で良いと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/28 12:49