Как использовать python deque?
Python’s deque: реализация эффективных очередей и стеков
Если вы часто работаете с списками в Python, то, вероятно, знаете, что они не работают достаточно быстро, когда вам нужно удалять элементы и добавлять их в начало списка. Модуль collections
в Python предоставляет класс под названием deque
, который специально разработан для обеспечения быстрого и памяти-эффективного способа добавления и удаления элементов с обоих концов структуры данных.
deque
в Python - низкоуровневый и высокооптимизированный двусторонний массив, который полезен для реализации элегантных, эффективных и питонических очередей и стеков - наиболее распространенных типов данных, похожих на список, в вычислительной технике.
В этом учебнике вы узнаете:
- Как создать и использовать
deque
в вашем коде на Python - Как эффективно добавлять и удалять элементы с обоих концов
deque
- Как использовать
deque
для создания эффективных очередей и стеков - Когда стоит использовать
deque
вместоlist
Для лучшего понимания этих тем вам следует знать основы работы со списками на Python. Также будет полезно иметь общее представление о очередях и стеках.
Наконец, вы напишете несколько примеров, которые помогут вам разобраться в некоторых общих случаях использования deque
, который является одним из самых мощных типов данных в Python.
Начало работы с deque
в Python
Добавление элементов и удаление их с правого конца списка в Python обычно являются эффективными операциями. Если использовать обозначение Большая О нотация для описания временной сложности, можно сказать, что их сложность - O(1). Однако, когда Python должен перераспределить память для увеличения размера списка для добавления новых элементов, эти операции могут замедлиться и стать O(n).
Кроме того, добавление и удаление элементов с левого конца списка в Python известно как неэффективные операции со скоростью O(n).
Поскольку списки на Python предоставляют обе эти операции с помощью .append()
и .pop()
, они могут быть использованы как стеки и очереди. Однако проблемы производительности, которые вы видели ранее, могут существенно повлиять на общую производительность ваших приложений.
deque
в Python был первым типом данных, добавленным в модуль collections
в Python 2.4.
Создание и использование deque
Чтобы использовать deque
в Python, вам нужно импортировать его из модуля collections
:
После этого вы можете создать экземпляр deque
, передав ему итерируемый объект:
Теперь у вас есть deque
с элементами [1, 2, 3, 4]
.
Добавление и удаление элементов
Чтобы добавить элемент в deque
справа, вы можете использовать метод .append()
:
Теперь у вас есть deque
с элементами [1, 2, 3, 4, 5]
.
Чтобы добавить элемент в deque
слева, вы можете использовать метод .appendleft()
:
Теперь у вас есть deque
с элементами [0, 1, 2, 3, 4, 5]
.
Чтобы удалить элемент справа из deque
и вернуть его значение, вы можете использовать метод .pop()
:
Теперь у вас есть deque
с элементами [0, 1, 2, 3, 4]
.
Чтобы удалить элемент слева из deque
и вернуть его значение, вы можете использовать метод .popleft()
:
Теперь у вас есть deque
с элементами [1, 2, 3, 4]
.
Доступ к элементам
Вы также можете получить доступ к элементам deque
, используя индексацию:
Вы также можете использовать срезы для получения подсписка из deque
:
Построение эффективных очередей с помощью deque
deque
в Python особенно полезен при создании эффективных очередей. Вы можете использовать его для реализации FIFO (First-In, First-Out) или LIFO (Last-In, First-Out) поведения.
FIFO очередь
LIFO стек
Заметка: для очереди и стека внутри
deque
можно использовать только методы.append()
и.popleft()
или.append()
и.pop()
, соответственно. Вы не должны использовать.appendleft()
или.popleft()
для стека и.append()
или.pop()
для очереди.
Обнаружение других возможностей deque
deque
в Python предлагает еще несколько полезных функций, которые могут быть применены в различных ситуациях.
Ограничение максимального количества элементов: maxlen
Вы можете ограничить максимальное количество элементов в deque
, указав параметр maxlen
при его создании:
Теперь у вас есть deque
, который может хранить не более 3 элементов. Если вы добавите больше элементов, самый старый элемент будет удален из deque
:
Поворот элементов: .rotate()
Вы можете повернуть элементы в deque
вправо или влево с помощью метода .rotate()
:
Добавление нескольких элементов одновременно: .extendleft()
Метод .extendleft()
позволяет добавить несколько элементов в deque
слева:
Использование функций, подобных спискам, в deque
Благодаря гибкости deque
в Python, вы можете использовать его с функциями, подобными спискам.
len()
и in
Использование срезов
Преобразование в list
Применение deque
в Python
Теперь рассмотрим несколько распространенных сценариев использования deque
, чтобы увидеть, как он может быть полезен в реальных проектах.
Сохранение истории страниц
Очередь deque
в Python может быть полезна для хранения истории просматриваемых страниц веб-сайта. Вы можете добавлять новые страницы в конец deque
и удалять старые страницы при достижении определенного размера:
Обмен данными между потоками
Если у вас есть множество потоков, которые должны обмениваться данными, deque
может быть полезным инструментом. Вы можете использовать один deque
в качестве буфера данных для потоков, добавляя данные в одном потоке и извлекая их в другом:
Эмуляция команды “tail”
deque
также может быть использован для эмуляции команды tail
в Unix. Вы можете организовать deque
в виде кольцевого буфера, который содержит последние N строк в файле:
Заключение
deque
в Python - это мощный и эффективный инструмент для работы с очередями и стеками. Он предлагает удобные методы для добавления, удаления и доступа к элементам с обоих концов. Кроме того, deque
имеет дополнительные функции, такие как ограничение максимального количества элементов, поворот элементов и добавление нескольких элементов одновременно. Он также обладает функциональностью, подобной спискам, что делает его удобным для использования с другими функциями Python.
Если вам нужно реализовать эффективные очереди и стеки, рассмотрите использование deque
вместо обычных списков. Это позволит улучшить производительность и упростить ваш код.