Поскольку регулярные выражения являются медленными (?)
Если обоснование использования ord()
и диапазона тестирования заключается в том, чтобы попытаться избежать медлительности регулярных выражений, то вы собираетесь разочароваться.
Давайте сравним решение регулярного выражения с sortString()
, подходом, использующим ord()
и тестирование диапазона, для группировки символов.
Подход регулярного выражения
Регулярные выражения используются для сопоставления нескольких групп диапазонов символов, а zip()
для объединения совпадений в списки групп.
>>> import re
>>> expr = re.compile(r"""([A-Z]+) | # Capitals.
... ([a-z]+) | # Lowercase.
... (\s+) | # Whitespace.
... ([!-/:-@\[-`{-~]+) # Punctuation and symbols.
... """,
... re.VERBOSE)
...
>>> [''.join(m) for m in zip(*expr.findall("The quick, and brown, fox"
... " jumped (not leaped) over"
... " the LAZY!!! dog =(."))]
['TLAZY',
'hequickandbrownfoxjumpednotleapedoverthedog',
' ',
',,()!!!=(.']
Синхронизация с рабочей реализацией для sortString()
в другие ответы, я получаю почти то же самое время для выполнения 10 ** 6 итераций.
>>> timeit.timeit("group_chars_regex(s)", globals=globals(), number=10**6)
16.637040594941936
Работа на виртуальной машине Linux на хосте Ma c, которому более 10 лет.
Подход к словарю
Быстрый поиск по словарю, давайте рассчитывать решение на основе словаря, которое выполняет группировки.
>>> groups = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ",
... "abcdefghijklmnopqrstuvwxyz",
... " \t\r\n",
... "!@#$%^&*()_+=-`~,..;:/?'\"[]{}\|")
>>> group_dict = {ch: n for n in range(4) for ch in groups[n]}
>>>
>>> def group_chars(s):
... lis = ['', '', '', '']
... for ch in s:
... lis[group_dict[ch]] += ch
... return lis
group_dict
карты каждой ча к индексу группы, к которой он принадлежит. Этот индекс используется для обновления строк в списке.
Сравнивая его с sortString()
, мы видим, что время сбрасывается на 4 с.
>>> timeit.timeit("group_chars(s)", globals=globals(), number=10**6)
12.557713539921679
>>>
>>> # The ord() and range testing method:
>>> timeit.timeit("sortString(s)", globals=globals(), number=10**6)
16.32978364895098
>>>
Подход dict
- это Самый быстрый из трех способов группировки.