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'。