一、什麼是deque?
deque是Python標準庫collections中的一個模塊,是雙向隊列(double-ended queue)的縮寫。雙向隊列是一種具有隊列和棧的性質的數據結構,可以在兩端進行元素的插入和刪除操作。deque比Python中內置的list容器在兩端插入和刪除元素有更好的性能表現。
from collections import deque d = deque() d.appendleft(1) # 在隊列左邊插入元素1 d.appendleft(2) # 在隊列左邊插入元素2 d.append(3) # 在隊列右邊插入元素3 d.append(4) # 在隊列右邊插入元素4 print(d) # deque([2, 1, 3, 4]) print(d.pop()) # 彈出隊列右邊的元素4 print(d.popleft()) # 彈出隊列左邊的元素2 print(d) # deque([1, 3])
二、優勢在哪裡?
deque的內部採用了雙向鏈表(doubly-linked list)的數據結構,支持O(1)時間複雜度的元素插入和刪除操作。相比之下,Python內置的list的內部結構是數組(array),在其左邊插入或刪除元素需要對整個數組進行移動,時間複雜度是O(n)。因此,在要求頻繁的在list的頭部或尾部進行插入和刪除操作時,deque比list的性能會更好。
三、實例演示:deque加速程序運行
下面我們來看一個例子,比較使用deque和list插入和刪除元素的時間差異:
import timeit from collections import deque def insert_list(): l = [] for i in range(10000): l.insert(0, i) def insert_deque(): d = deque() for i in range(10000): d.appendleft(i) print('list插入操作:', timeit.timeit('insert_list()', 'from __main__ import insert_list', number=100)) print('deque插入操作:', timeit.timeit('insert_deque()', 'from __main__ import insert_deque', number=100)) def delete_list(): l = list(range(10000)) for i in range(10000): l.pop(0) def delete_deque(): d = deque(range(10000)) for i in range(10000): d.popleft() print('list刪除操作:', timeit.timeit('delete_list()', 'from __main__ import delete_list', number=100)) print('deque刪除操作:', timeit.timeit('delete_deque()', 'from __main__ import delete_deque', number=100))
結果顯示,deque相比list要快得多。在插入操作上,deque的效率是list的132倍;在刪除操作上,deque的效率是list的15倍。
四、使用deque進行多線程編程
在多線程編程中,線程的同步和互斥非常重要。deque可以作為線程安全的隊列使用,支持線程安全的消費者生產者模式,實現同步和互斥。兩個線程可以在同一個deque中生產和消費數據。使用鎖可以確保多個線程沒有衝突,訪問隊列的順序是線程安全的,不會發生數據競爭。
from collections import deque import threading import time cond = threading.Condition() deque_list = deque() class Producer(threading.Thread): def run(self): nums = range(5) global deque_list with cond: for num in nums: deque_list.append(num) print('Produced:', num) time.sleep(1) cond.notify() class Consumer(threading.Thread): def run(self): global deque_list with cond: while True: if not deque_list: print('Waiting for elements...') cond.wait() print('Notified for elements...') num = deque_list.popleft() print('Consumed:', num) time.sleep(1) Producer().start() Consumer().start()
上述代碼中,我們定義了一個條件鎖cond和一個空deque列表deque_list。生產者和消費者各自佔用一個線程,在生產數據時使用條件鎖進行同步,檢查deque_list是否為空,為空的話就調用wait()函數進行等待。在消費數據時也使用條件鎖進行同步,當生產者把數據加到deque_list中後調用notify()函數進行通知,消費者能夠繼續取出數據進行消費。
五、結語
deque是Python標準庫中一個強大的數據容器,在需要高效率地進行隊列操作時,使用deque可以讓程序快速運行。同時,deque作為線程安全的數據容器,可以幫助在多線程編程中實現同步和互斥,有效提高程序運行效率。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/252863.html