match намного быстрее, чем поиск, поэтому вместо выполнения regex.search («word») вы можете делать regex.match ((. *?) word (. *?)) и набирать тонны производительности, если вы работаете с миллионами образцов.
Этот комментарий от @ivan_bilan в соответствии с принятым ответом выше заставил меня думать, если такой hack на самом деле ускоряя что-нибудь, поэтому давайте выясним, сколько тонн производительности вы действительно получите.
Я подготовил следующий набор тестов:
import random import re import string import time LENGTH = 10 LIST_SIZE = 1000000 def generate_word(): word = [random.choice(string.ascii_lowercase) for _ in range(LENGTH)] word = ''.join(word) return word wordlist = [generate_word() for _ in range(LIST_SIZE)] start = time.time() [re.search('python', word) for word in wordlist] print('search:', time.time() - start) start = time.time() [re.match('(.*?)python(.*?)', word) for word in wordlist] print('match:', time.time() - start)
Я сделал 10 измерений (1M, 2M, ..., 10M слов), что дало мне следующий график:
Полученные линии на удивление (на самом деле не так уж удивительно) прямолинейны. И функция
search
(немного) быстрее, учитывая эту конкретную комбинацию шаблонов. Мораль этого теста: Избегайте переопределения вашего кода.