Ответ
collections.deque (двусторонняя очередь) следует использовать вместо списка (list), когда требуется быстрое добавление и удаление элементов с обоих концов коллекции.
Ключевое отличие: Производительность
deque: Операцииappend,pop,appendleft,popleftимеют амортизированную сложность O(1).list:appendиpop(с конца) также имеют сложность O(1), ноinsert(0, ...)иpop(0)(с начала) требуют сдвига всех элементов и имеют сложность O(n).
Основные сценарии использования deque:
- Реализация очередей (FIFO): Использовать
appendдля добавления иpopleftдля извлечения. - Скользящее окно: Хранение N последних элементов из потока данных с помощью параметра
maxlen. - Алгоритмы обхода графов (BFS): Где требуется эффективная очередь для хранения вершин.
Пример:
from collections import deque
# 1. Быстрые операции с обоих концов
d = deque([1, 2, 3])
d.appendleft(0) # O(1) -> deque([0, 1, 2, 3])
d.append(4) # O(1) -> deque([0, 1, 2, 3, 4])
d.popleft() # O(1) -> возвращает 0, d = deque([1, 2, 3, 4])
# 2. Ограничение размера (скользящее окно)
last_five_logs = deque(maxlen=5)
for i in range(10):
last_five_logs.append(f"Log entry {i}")
# deque автоматически удаляет старые элементы
print(last_five_logs)
# Вывод: deque(['Log entry 5', 'Log entry 6', 'Log entry 7', 'Log entry 8', 'Log entry 9'], maxlen=5)
Вывод: Если вам нужна структура данных, оптимизированная для операций в начале и в конце, deque — лучший выбор. Для произвольного доступа по индексу и операций в середине коллекции list остается более эффективным.