Python中Queue和Collections的區別


佇列是一種遵循FIFO(先進先出)交付方式的資料結構,即一組訊息的順序嚴格保持不變。它精確地處理所有訊息一次,因此不會出現訊息重複。

FIFO系統相對於標準交付方式的優勢在於,由於應用了佇列的批次處理,佇列能夠支援無限吞吐量。FIFO具有高吞吐量(透過流程的專案數量),並且可以處理比平均水平多得多的訊息。

在Python中,佇列可以透過兩個主要的庫來實現:collections庫和queue庫。儘管它們都用於佇列實現,但兩者之間存在許多差異,這些差異對於不同的用例場景可能是最佳的。主要區別列在下面

主要區別

類別 queue.Queue() collections.deque()
同步 'queue.Queue' 提供了安全的處理多執行緒操作的方法,因為它實現了同步。 'collections.deque' 預設情況下不同步,因此可能不適用於可能使用多個執行緒的操作。
功能 'queue.Queue' 特別用於佇列實現以及FIFO交付系統,其中元素新增到末尾。它提供諸如put()和get()之類的函式,用於對佇列中存在的元素進行入隊和出隊操作。 對於'collections.deque',它更像是一個標準的實現,同時實現了LIFO和FIFO的概念,因此也可以用於堆疊操作。諸如append()、pop()和popleft()之類的函式使您可以從兩端新增和刪除元素。
其他 'queue.Queue'除了基本的佇列函式外,沒有提供其他功能。 'collections.deque' 提供更多功能來修改或更改給定的佇列,例如rotate()函式可以以任何方式旋轉佇列,remove()函式可以從deque中刪除特定元素。
效能 從複雜度來看,'collections.deque'由於使用雙向連結串列,速度更快。因此,它的複雜度為O(1),因此可以更快地執行操作。 在'queue.Queue'中,由於其同步開銷,尤其是在多執行緒處理過程中,速度略慢。

queue.Queue

在Python中,queue模組提供了一個'Queue()'類,該類提供了一個數據結構。Queue()類有一個queue方法,該方法透過實現佇列資料結構來工作。

語法

Queue().put(value)
Queue().get(value)

這裡,value是使用put()函式入隊的元素。要從佇列中刪除元素,我們使用get()函式執行出隊操作。

演算法

  • 匯入庫。

  • 初始化佇列。

  • 入隊一些元素。

  • 檢查它們是否為空。

  • 如果不為空,則出隊元素並列印它們。

示例

#import the necessary library
from queue import Queue

#assign an object to the queue class
m_q=Queue()

#Enqueue elements in a queue
m_q.put(20)
m_q.put(40)
m_q.put(60)

#Dequeuing the elements and printing them
while not m_q.empty():
  i=m_q.get()
  print(i)

輸出

20
40
60

我們首先匯入queue模組併為queue類分配一個物件。然後我們使用put()函式入隊元素。然後,我們初始化一個while迴圈,直到佇列為空為止,不斷地出隊元素。然後將出隊的元素列印為輸出。

collections.deque

在Python中,collections.deque類用於引入雙端佇列資料結構。“Deque”代表“雙端佇列”。在此,可以有效地從佇列的兩端新增或刪除元素。

語法

deque().append(20)
deque().appendleft(60)
deque().pop()
deque().popleft()

這裡我們使用deque(雙端佇列)來展示對deque兩端進行入隊和出隊操作。

20正常追加,然後60在20的左邊追加到deque中。之後,可以使用pop()和popleft()函式在任一側執行出隊操作。

演算法

  • 匯入庫。

  • 初始化deque。

  • 從左側或右側新增元素。

  • 彈出元素。

  • 列印佇列。

示例

from collections import deque

# Create a new deque
my_deque = deque()

# Add elements to the deque
my_deque.append(20)  # Add to the right end
my_deque.appendleft(40)  # Add to the left end
my_deque.append(60) #Add to right end
print("Initial deque: \n",my_deque)

# Remove elements from the deque
right_element = my_deque.pop()  # Remove from the right end
print("\nAfter removing element from right: \n",my_deque)

left_element = my_deque.popleft()  # Remove from the left end
print("\nAfter removing element from left :\n", my_deque)

# Print the deque's contents
my_deque.pop()
print("\nFinal deque: \n",my_deque)

輸出

Initial deque: 
 deque([40, 20, 60])

After removing element from right: 
 deque([40, 20])

After removing element from left :
 deque([20])

Final deque: 
 deque([])

它的一些優點是:

較低的複雜度 collections.deque()由於使用了雙向連結串列,複雜度較低,複雜度為O(1),這適用於從佇列的兩端進行插入和刪除的情況。
動態大小 與預先定義容量且儲存相當嚴格的常規佇列不同,collections.deque可以動態更改其佇列大小。達到最大容量時,無需調整大小或複製元素。

結論

'queue.Queue'和'collections.deque'都用於佇列實現。但是,從效能方面來看,它們在執行不同操作時存在微小的差異。但是,由於其附加功能,'collections.deque'被廣泛使用。除了多執行緒示例中同步是關鍵的情況外,大多數情況下使用'collections.deque'。

更新於:2023年8月10日

130 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告