📜  Python的队列(1)

📅  最后修改于: 2023-12-03 14:46:46.035000             🧑  作者: Mango

Python 的队列

队列(Queue)是一种先进先出(FIFO,First In First Out)的数据结构,Python 提供了一些内置的数据类型和模块来处理队列。Python 中常用的队列类型有列表(List)和双端队列(Deque)。此外,Python 还提供了标准库中的 Queue 模块,用于实现线程间通信的队列。本文将分别介绍这三种队列类型。

列表(List)

列表(List)是 Python 的内置数据类型之一,可以被用作队列。在列表末尾添加元素和删除列表开头的元素可以很方便地实现先进先出的队列。以下是一个简单的例子:

queue = []
queue.append('a')
queue.append('b')
queue.append('c')
print(queue.pop(0))  # 输出 'a'
print(queue.pop(0))  # 输出 'b'

列表中的 append 方法可以将元素添加到末尾,pop(0) 方法可以删除并返回列表的第一个元素。但是,从列表中删除第一个元素通常是很慢的,因为所有的元素都需要向前移动以填补空缺。因此,在需要高效地操作队列时,双端队列会更好。

双端队列(Deque)

双端队列(Deque)提供了一些列表没有的额外操作,因此可以更好地支持在两端添加或删除元素。它是 Python 的 collections 模块中的一种数据类型,可以通过以下方式导入:

from collections import deque

以下是一个简单的双端队列的例子:

queue = deque()
queue.appendleft('a')
queue.appendleft('b')
queue.appendleft('c')
print(queue.pop())   # 输出 'a'
print(queue.pop())   # 输出 'b'

在双端队列中,我们使用 appendleft 方法和 popleft 方法来分别在左边添加和删除元素。这些操作的时间复杂度都是 O(1),因此很适用于高效地操作队列。

Queue 模块

Python 的标准库中的 Queue 模块提供了线程安全(thread-safe)的队列实现,用于在多个线程之间(或进程之间)传递消息或数据。它提供了三种类型的队列:FIFO(先进先出)队列、LIFO(后进先出)队列和优先级队列。以下是一个简单的 FIFO 队列的例子:

from queue import Queue

queue = Queue()
queue.put('a')
queue.put('b')
queue.put('c')
print(queue.get())   # 输出 'a'
print(queue.get())   # 输出 'b'

在 Queue 模块中,我们使用 put 方法将元素添加到队列尾部,使用 get 方法从队列头部删除并返回元素。队列默认是阻塞的,即当队列为空时,get 方法会一直阻塞等待直到队列中有元素。当队列已满时,put 方法也会阻塞等待直到队列有空闲空间。如果需要非阻塞的队列操作,可以使用 put_nowait 和 get_nowait 方法。

以上就是 Python 中常用的队列类型,需要根据实际情况选择不同的类型。在单线程环境下,列表和双端队列既可以实现队列的功能,但在多线程或者多进程的情况下,建议使用 Queue 模块。