Regex Explaination [duplicate]

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 (немного) быстрее, учитывая эту конкретную комбинацию шаблонов. Мораль этого теста: Избегайте переопределения вашего кода.

52
задан 17 revs, 12 users 32% 8 April 2014 в 21:11
поделиться