Подтвердить что ты не робот

Какая более быстрая операция, re.match/search или str.find?

Для одного запроса на строку, проще ли просто использовать str.find/rfind, чем использовать re.match/search?

То есть для данной строки s следует использовать:

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

или

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

?

4b9b3361

Ответ 1

Вопрос: на который лучше ответить, используя 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

Используйте это:

if 'lookforme' in s:
    do something

Сначала нужно скомпилировать регулярное выражение, которое добавляет некоторые накладные расходы. Обычный поиск строк в Python очень эффективен.

Если вы выполняете поиск по одному и тому же термину или когда выполняете что-то более сложное, regex становится более полезным.

Ответ 3

re.compile значительно ускоряет регулярные выражения, если вы ищете одно и то же снова и снова. Но я просто получил огромное ускорение, используя "в", чтобы отбросить плохие случаи, прежде чем я сравню. Я знаю, анекдотом. ~ Бен

Ответ 4

У меня была такая же проблема. Я использовал Jupyter% timeit для проверки:

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 ns ± 3 ns за цикл (среднее значение ± std. dev из 7 прогонов, 10000000 циклов каждый)

x в списке токенов 93.3 ns ± 1.26 ns за цикл (среднее значение ± std. dev из 7 прогонов, 10000000 циклов каждый)

поиск в регулярном выражении 772 ns ± 8,42 нс за цикл (среднее ± стандартное отклонение 7 прогонов, 1000000 циклов каждый)

скомпилированный поиск в регулярном выражении 420 ns ± 7,68 нс за цикл (среднее ± стандартное отклонение 7 прогонов, 1000000 циклов каждый)

Компиляция выполняется быстро, но проще.