一、什麼是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-hk/n/252863.html
微信掃一掃
支付寶掃一掃