Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
А быстрее — можно?
def start_element(name, attrs):
tags[name] = tags[name] + 1 if name in tags else 1
def start_element(name, attrs):
try:
tags[name] += 1
except KeyError:
tags[name] = 1
Или вообще collections.Counter().if name in tags. Учитывая то, что эта функция вызывается крайне часто, можно получить существенный прирост скорости.from collections import defaultdict
…
tags = defaultdict(lambda: 0)
…
def start_element(name, attrs):
tags[name] += 1
tags не считается, так как должно присутствовать в обоих случаях) против либо длинной, либо и вовсе четырёх. Читаемость везде нормальная, но если конструкций с except KeyError: много, то, если скорость позволяет, уж лучше использовать ваш вариант.d = defaultdict(int)
…
d[x] += 1
try:
d[x] += 1
except KeyError:
d[x] = 1
if x in d:
d[x] += 1
else:
d[x] = 1
d[x] = d[x] + 1 if x in d else 1
import re
n = 5
with open("./pg2600.txt", "r") as f:
s = f.read()
d={}
for x in re.findall(r'\w+',s):
<tested code here>
print repr([k for k,v in d.items() if v == n])
except KeyError: (разница мала или очень мала, но он всегда быстрее), последние два могут показывать близкую производительность (но ваш всегда медленнее).int, а не lambda: 0. Разница в скорости, впрочем, не обнаружена.
Самый быстрый SAX-парсер для python