Python 中的 Queue.LIFOQueue 与 Collections.Deque 的比较


在这篇文章中,我们将学习 Python 编程语言中 Queue.LIFOQueue 与 Collections.Deque 的区别。当我们需要使用后进先出 (LIFO) 方法管理数据时,可以使用这些数据结构。但是,要选择其中一个,我们需要了解它们的功能和特性。在此之前,让我们先了解 Queue.LIFOQueue 和 Collections.Deque。

LIFOQueue

此类是 queue 模块的一部分。它作为一个栈数据结构工作,并且被认为是线程安全的,这意味着它可以同时处理不同的线程。以下是此类的一些规范。

  • 基于栈 - LIFOQueue 的行为类似于栈数据结构,这意味着最后插入的项将在检索后首先出现。

  • 线程安全 - 使用此类,我们可以应用同步机制并将其用作多线程应用程序。

  • 阻塞 I/O 操作 - 在 Queue.LIFOQueue 中,我们可以选择使用 get() 和 put() 阻塞线程。这使得线程可以等待直到满足条件,例如项目可用或队列为空。

  • 大小 - Queue.LIFOQueue 有一个 size 参数,它限制了队列的大小并限制了要插入的项目数量。

让我们来看一个 Queue.LIFOQueue 的示例。

示例

class LifoQueueClass:
   def __init__(self):
      self.ele = []

   def is_empty(self):
      return len(self.ele) == 0

   def push(self, item):
      self.ele.append(item)

   def pop(self):
      if self.is_empty():
         return None
      return self.ele.pop()

   def size(self):
      return len(self.ele)

   def display(self):
      print("LIFO Queue: ", self.ele)


queueDs = LifoQueueClass()

queueDs.push("Banana")
queueDs.push("Apple")
queueDs.push("Guava")
queueDs.push("Litchi")

print("Updated Queue After inserting items: ")
queueDs.display()

removed_item = queueDs.pop()
print("\nPopped item:", removed_item)

print("Updated Queue After pop: ")
queueDs.display()

print("\nQueue size:", queueDs.size())

if queueDs.is_empty():
   print("Queue is empty\n")
else:
   print("Queue is not empty\n")

输出

Updated Queue After inserting items: 
LIFO Queue:  ['Banana', 'Apple', 'Guava', 'Litchi']

Popped item: Litchi
Updated Queue After pop: 
LIFO Queue:  ['Banana', 'Apple', 'Guava']

Queue size:3
Queue is not empty

解释

在这个程序中,我们创建了一个名为 **LifoQueueClass** 的队列类。在类中,我们有不同的方法,例如 **push** 用于将项目插入队列,**pop** 用于从队列中删除项目,**size** 用于检查,**is_empty** 用于检查队列是否为空,也就是说队列中没有剩余项目。我们创建队列类的对象,并使用该对象调用 push 函数并传递我们想要插入的项目。使用 display 函数,我们可以显示队列中存在的项目。

Collections.deque

这是一个 Python 中 collection 模块的一部分的类。它作为一个双端队列 (deque) 工作,并且具有许多功能,以下是一些规范:

  • 基于双端队列 - Collections.deque 的行为类似于双端队列数据结构,它支持从两端插入和删除操作。它有许多方法,例如 append()、appendLeft() 用于将元素插入到双端队列中,以及 pop()、popLeft() 用于从双端队列中移除项目。

  • 大小 - 与 LIFOQueue 不同,双端队列没有最大大小参数,它可以根据项目的长度动态增加和减少。

  • 高效 - 双端队列为从两端插入和检索元素提供了高效的操作,时间复杂度为常数。

让我们来看一个 Collection.deque 的示例。

示例

from collections import deque

Dqueue = deque()

Dqueue.append("Banana")
Dqueue.append("Apple")
Dqueue.append("Guava")
Dqueue.append("Litchi")

print("Queue:", Dqueue)

ele = Dqueue.popleft()
print("Removed element:", ele)

print("\nUpdated Queue:", Dqueue)

if not Dqueue:
   print("Queue is empty.")
else:
   print("Queue is not empty.")

Dqueue.append("Mango")
Dqueue.append("Papaya")

print("\nUpdated Queue:", Dqueue)

print("\nQueue size:", len(Dqueue), "\n")

while Dqueue:
   ele = Dqueue.popleft()
   print("Dequeued element:", ele)

if not Dqueue:
   print("Queue is empty.")
else:
   print("Queue is not empty.")

输出

Queue: deque(['Banana', 'Apple', 'Guava', 'Litchi'])
Removed element: Banana

Updated Queue: deque(['Apple', 'Guava', 'Litchi'])
Queue is not empty.

Updated Queue: deque(['Apple', 'Guava', 'Litchi', 'Mango', 'Papaya'])

Queue size: 5 

Dequeued element: Apple
Dequeued element: Guava
Dequeued element: Litchi
Dequeued element: Mango
Dequeued element: Papaya
Queue is empty.

解释

在这个程序中,我们使用 deque 创建一个空队列。为了添加元素,我们使用 append() 方法并传递要插入到队列中的元素。使用 popLeft() 方法,我们从队列中删除了项目。然后我们检查队列是否为空,并使用 **queue.append("Mango")** 将另外两个项目添加到队列中。为了从队列中移除所有项目,我们使用 while 循环并打印正在移除的项目。

因此,我们看到了 Queue.LIFOQueue 和 Collections.Deque 之间的区别。我们了解了这两种数据结构的一些关键特性。我们看到了从 LIFOQueue 和 Deque 插入和检索元素的不同方法。通过这两种数据结构的程序,我们了解了这两种数据结构的工作原理。因此,deque 被认为是一种高效的数据结构,因为它允许我们在常数时间内从两端操作数据。Deque 也允许我们使用索引检索数据,但它的效率低于从末尾检索。

更新于:2023年10月3日

210 次浏览

启动您的职业生涯

完成课程后获得认证

开始
广告
© . All rights reserved.