2011-02-04 8 views
38

1つのオフストリングの検索では、re.match/searchを使用するよりもstr.find/rfindを使用するほうが簡単ですか? 、与えられた文字列のため、あるよより速い操作、re.match/searchまたはstr.findとは何ですか?

は、私が使用する必要があります。

if s.find('lookforme') > -1: 
    do something 

または

if re.match('lookforme',s): 
    do something else 

+3

1つのみのために、余分なオーバーヘッドのために、正規表現が遅くなることは確かです。 –

+1

2つの機能が異なるため、2つを比較する際には注意が必要です。 Findは文字列全体を検索し、一致は先頭にのみ一致します(つまり、データに応じて早く終了することができます)。あなたはリンゴとオレンジを比較しています。 –

答えて

91

質問:どちらが速いかは、timeitを使用すると最もよく答えられます。

from timeit import timeit 
import re 

def find(string, text): 
    if string.find(text) > -1: 
     pass 

def re_find(string, text): 
    if re.match(text, string): 
     pass 

def best_find(string, text): 
    if text in string: 
     pass 

print timeit("find(string, text)", "from __main__ import find; string='lookforme'; text='look'") 
print timeit("re_find(string, text)", "from __main__ import re_find; string='lookforme'; text='look'") 
print timeit("best_find(string, text)", "from __main__ import best_find; string='lookforme'; text='look'") 

出力は次のようになります。読みやすくなりますので、それは速くもあるので

0.441393852234 
2.12302494049 
0.251421928406 

はそうではないだけで、あなたはin演算子を使用する必要があります。

+2

時間に基づいて選択するのが最適なマイクロ最適化。しかし、あなたが最も読みやすいケースを指定してから+1します... – ircmaxell

+5

あなたは確かに適切に質問に答えました、sukhbir。合意しましたが、可読性は+1ですが、その答えが「ピジョンソニック」であることが証明されています。 –

+4

明らかに、あなたは "best_find"という名前の1つを呼び出すことによって自動陪審員を導いたのです。 –

14

使用この:

if 'lookforme' in s: 
    do something 

正規表現は、いくつかのオーバーヘッドが追加され、最初にコンパイルする必要があります。 Pythonの通常の文字列検索は、とにかく非常に効率的です。

同じ用語をたくさん検索したり、もっと複雑なことをすると、正規表現がより有用になります。

+4

+1最初はpythonicです - パフォーマンスが問題になる場合は、さまざまな実装を試してパフォーマンスが向上するかどうかを確認してください。 –

7

re.compileは、同じことを何度も繰り返し検索している場合、正規表現を高速化します。しかし、私はちょうど私が一致する前に悪いケースを淘汰するために "インチ"を使用することによって巨大なスピードアップを得た。事実、私は知っている。 〜ベン

2

私は同じ問題を抱えています。私は確認するJupyterの%はtimeitを使用する:ループあたり±3 NSは

import re 
sent = "a sentence for measuring a find function" 
sent_list = sent.split() 
print("x in sentence") 
%timeit "function" in sent 
print("x in token list") 
%timeit "function" in sent_list 

print("regex search") 
%timeit bool(re.match(".*function.*", sent)) 
print("compiled regex search") 
regex = re.compile(".*function.*") 
%timeit bool(regex.match(sent)) 

Xを文章で61.3ナノ秒をトークンリスト93.3ナノ秒で

X(。。STD DEV平均±7つのラン、10000000のループ毎の)ループごと(STD。DEV平均±7つのラン、10000000のループ各々)1.26ナノ秒±

正規表現検索ループ当たり8.42ナノ秒±772ナノ秒(STD。DEV平均±7回のランの1000000のループ毎)

コンパイル済みの正規表現検索ループあたり420 ns±7.68 ns(平均±標準誤差、実行回数7回、それぞれ1000000ループ)

コンパイルは高速ですが、シンプルな方が良いです。

関連する問題