Я использую collections.Counter
для подсчета слов в определенной строке:
s = """Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."""
lorem = s.lower().split()
Обратите внимание, что это меньше, чем реальная строка, на которую я пытался, но вывод / результаты обобщаемы.
%%timeit
dcomp = Counter(lorem)
# 8 µs ± 329 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Если я использую это (то же самое, что часть исходного кода cpython / Lib / collection / init .py)
%%timeit
d = dict()
get = d.get
for w in lorem:
d[w] = get(w, 0) + 1
# 15.4 µs ± 1.61 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
РЕДАКТИРОВАТЬ: Используйте функцию:
def count():
d = dict()
get = d.get
for w in lorem:
d[w] = get(w, 0) + 1
return d
%%timeit
count()
# Still significantly slower. function definition not in timeit loop.
# 14 µs ± 763 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Для гораздо большей строки результаты аналогичны, и последний процесс занимает примерно в 1,8-2 раза больше, чем первый.
Часть исходного кода, которая работает здесь:
def _count_elements(mapping, iterable):
'Tally elements from the iterable.'
mapping_get = mapping.get
for elem in iterable:
mapping[elem] = mapping_get(elem, 0) + 1
Из которых отображение является экземпляром самого себя super(Counter, self).__init__()
-> dict()
. Та же скорость сохранилась после того, как я поместил все последние попытки в функцию и вызвал эту функцию. Я не могу понять, откуда эта разница в скорости. Есть ли особый режим, который получает Python? Или некоторые замечания, которые я упустил.