1
0

More than 3 years have passed since last update.

Python の正規表現マッチングで引数付groupを使うと遅いのか検証する

Last updated at Posted at 2020-04-15

結論

  • 正規表現でグループを指定するとちょっと遅くなる。(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

倍くらい違うのかと思ったけどそうでもなかったです。
標準ライブラリの関数はよくできているのだなぁと思いました(小並感)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0