Какая более быстрая операция, 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
?
Ответы
Ответ 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 циклов каждый)
Компиляция выполняется быстро, но проще.