結論
- 正規表現でグループを指定するとちょっと遅くなる。(14%)
- 引数付でgroup(1)とかするとさらにちょっと遅くなる。(22%)
- 遅くならないわけではないけど倍かかるわけでなし別に気にする必要ない。(個人差があります)
- 何行もロジック書くよりは標準ライブラリの関数使ったほうがだいたいにおいてマシ。
やる気あったんか
どちらかというとQiitaになんか書こうというモチベーションでした。すいやせんした。
Pythonの正規表現でマッチしたあとmatchobj.group(1)とかするとなんか遅い気がしたし、簡単に検証できそうだったのでとりあえず書きますという気持ちです。
環境
- Windows 10 Home
- Python 3.6.6
- ipython 6.4.0
実験用コード
import re
seq = "hoge123fugafoobar456zoo"
pat1 = re.compile(r"\S+\d{3}\S+\d{3}\S+")
pat2 = re.compile(r"\S+(\d{3})\S+(\d{3})\S+")
def matchA():
for i in range(100):
mat1 = pat1.match(seq)
groupA = mat1.group()
def matchB():
for i in range(100):
mat2 = pat2.match(seq)
groupB = mat2.group()
def matchC():
for i in range(100):
mat2 = pat2.match(seq)
groupC = mat2.group(1)
でIPython REPLから以下のようにする。
In[0]: %%timeit
...: matchA()
...:
結果
関数 | 正規表現 | 正規表現でグループを含む | group() | 実行時間 | % |
---|---|---|---|---|---|
matchA | r"\S+\d{3}\S+\d{3}\S+" | 含まない | group() | 111μs | 100 |
matchB | r"\S+(\d{3})\S+(d{3})\S+" | 含む | group() | 127μs | 114 |
matchC | r"\S+(\d{3})\S+(d{3})\S+" | 含む | group(1) | 135μs | 122 |
倍くらい違うのかと思ったけどそうでもなかったです。
標準ライブラリの関数はよくできているのだなぁと思いました(小並感)