Python re.split() против split ()

В моих поисках оптимизации я обнаружил, что этот встроенный метод split() примерно на 40% быстрее, чем эквивалентный re.split().

Фиктивный тест (легко копируемый):

import re, time, random 

def random_string(_len):
    letters = "ABC"
    return "".join([letters[random.randint(0,len(letters)-1)] for i in range(_len) ])

r = random_string(2000000)
pattern = re.compile(r"A")

start = time.time()
pattern.split(r)
print "with re.split : ", time.time() - start

start = time.time()
r.split("A")
print "with built-in split : ", time.time() - start

Почему эта разница?

3 ответа

Решение

re.split ожидается, что будет медленнее, так как использование регулярных выражений влечет за собой некоторые накладные расходы.

Конечно, если вы разбиваете на постоянную строку, нет смысла использовать re.split(),

В случае сомнений проверьте исходный код. Вы можете увидеть, что Python s.split() оптимизирован для пробелов и встроен. Но s.split() только для фиксированных разделителей.

Для компромисса между скоростями разделение на основе регулярных выражений с повторным разделением является гораздо более гибким.

>>> re.split(':+',"One:two::t h r e e:::fourth field")
['One', 'two', 't h r e e', 'fourth field']
>>> "One:two::t h r e e:::fourth field".split(':')
['One', 'two', '', 't h r e e', '', '', 'fourth field']
# would require an addition step to find the empty fields...
>>> re.split('[:\d]+',"One:two:2:t h r e e:3::fourth field")
['One', 'two', 't h r e e', 'fourth field']
# try that without a regex split in an understandable way...

Тот re.split() только на 29% медленнее (или что s.split() только на 40% быстрее) это то, что должно быть удивительно.

Запуск регулярного выражения означает, что вы запускаете конечный автомат для каждого символа. Деление с постоянной строкой означает, что вы просто ищете строку. Второй - гораздо менее сложная процедура.

Другие вопросы по тегам