time.time() помогает измерять длительность, sleep() делает задержку.
collections содержит специализированные структуры данных.
OrderedDict сохраняет порядок и умеет move_to_end().
popitem(last=False) удаляет первый элемент OrderedDict, что удобно для очереди.
Кэш хранит результаты повторных операций, LRU удаляет давно не используемые записи.
@lru_cache кэширует вызовы функции по аргументам.
defaultdict создаёт значение по умолчанию при обращении к отсутствующему ключу.
Counter считает элементы и умеет most_common(), elements(), update(), subtract().
Топ-3 ошибки: использовать sleep() в измерении быстрых операций; забывать, что defaultdict добавляет ключ при чтении; ожидать от Counter вычитания отрицательные значения при операторе -.
defaultdict меняется при чтении
Обращение dd['missing'] создаёт новый ключ.
Если не хотите менять словарь, используйте get().
from collections import defaultdict
dd = defaultdict(list)
print(dd.get("missing", []))
print(dict(dd))
Нехешируемые аргументы в lru_cache
@lru_cache не принимает list как часть ключа кэша.