Python是一種簡單易學、功能強大的編程語言。但與此同時,Python程序也因其解釋執行的特性而臭名昭著的慢。但是,Python也提供了許多有效地優化程序性能的技巧和方法,本文將著重介紹其中一種——deque的add方法。
一、什麼是deque?
import collectionsdeque = collections.deque(maxlen=3)deque.append(1)deque.append(2)deque.append(3)print(deque)
deque是一個雙端隊列,支持從兩端高效地添加和刪除元素。在上述代碼中,我們用collections模塊創建了一個長度為3的deque並向其中添加了數值為1、2、3的元素。運行上述代碼可以得到以下輸出:
deque([1, 2, 3], maxlen=3)
從輸出結果可以看出,當向deque中添加元素時,如果超過了指定的長度,隊列的左端就會自動刪除一個元素,保證隊列的大小不超過指定的長度。
二、deque的add方法
deque提供了add方法,該方法可以同時向隊列的左端和右端添加元素。下面是一個示例代碼:
import collectionsdeque = collections.deque(maxlen=3)deque.append(1)deque.append(2)deque.append(3)deque.appendleft(4)print(deque)
在上述代碼中,我們使用append和appendleft分別向deque的右端和左端添加了元素,運行代碼後得到以下輸出:
deque([4, 1, 2], maxlen=3)
從輸出結果可以看出,add方法的調用順序與傳入元素的位置有關。在上面的示例中,我們先向右端添加了數值為1、2、3的元素,然後又向左端添加了數值為4的元素,最終得到的結果是4、1、2三個元素。
三、deque add方法的使用場景
當我們需要高效地維護一個固定大小的元素集合時,deque的add方法就可以派上用場了。例如:
1. 實時數據處理場景
在實時數據處理場景下,我們需要不斷地從輸入流中讀取數據,並將這些數據添加到緩存中,以便下一步對這些數據進行處理。我們可以使用deque來維護一個固定大小的緩存,當讀取到新數據時,直接調用add方法,將數據添加到緩存的右端。
下面是一個示例代碼:
import collectionsimport randomdeque = collections.deque(maxlen=5)for i in range(20): data = random.randint(1, 100) deque.append(data) print(f"add data {data}: {deque}")
在上面的代碼中,我們模擬了一個實時數據處理場景,隨機生成20個數值並將其添加到長度為5的deque對象中。運行上面的代碼可以得到類似下面的輸出:
add data 58: deque([58], maxlen=5)add data 38: deque([58, 38], maxlen=5)add data 39: deque([58, 38, 39], maxlen=5)add data 31: deque([58, 38, 39, 31], maxlen=5)add data 75: deque([58, 38, 39, 31, 75], maxlen=5)add data 6: deque([38, 39, 31, 75, 6], maxlen=5)add data 69: deque([39, 31, 75, 6, 69], maxlen=5)add data 65: deque([31, 75, 6, 69, 65], maxlen=5)add data 3: deque([75, 6, 69, 65, 3], maxlen=5)add data 80: deque([6, 69, 65, 3, 80], maxlen=5)add data 95: deque([69, 65, 3, 80, 95], maxlen=5)add data 56: deque([65, 3, 80, 95, 56], maxlen=5)add data 97: deque([3, 80, 95, 56, 97], maxlen=5)add data 13: deque([80, 95, 56, 97, 13], maxlen=5)add data 90: deque([95, 56, 97, 13, 90], maxlen=5)add data 59: deque([56, 97, 13, 90, 59], maxlen=5)add data 94: deque([97, 13, 90, 59, 94], maxlen=5)add data 81: deque([13, 90, 59, 94, 81], maxlen=5)add data 20: deque([90, 59, 94, 81, 20], maxlen=5)
從輸出結果可以看出,當調用add方法向deque中添加新元素時,如果超過了指定的長度,隊列的左端就會自動刪除一個元素,保證隊列的大小不超過指定的長度。在上面的示例中,當添加第6個元素時,隊列的長度已經達到了指定的5,因此隊列的左端就刪除了第1個元素。
2. 緩存數據場景
在緩存數據場景下,我們需要維護一個大小有限的緩存用於存儲熱門數據,以減少訪問資料庫的次數。當有新數據需要添加到緩存中時,可以使用deque的add方法將新數據添加到緩存的左端,同時刪除緩存中最老的數據。
下面是一個示例代碼:
import collectionsclass Cache: def __init__(self, capacity): self.cache = collections.deque(maxlen=capacity) def add(self, key, value): if key in self.cache: self.cache.remove(key) self.cache.appendleft((key, value)) print(f"add key: {key} value: {value}, cache: {self.cache}") def get(self, key): for k, v in self.cache: if k == key: self.cache.remove((k, v)) self.cache.appendleft((k, v)) print(f"get key: {key} value: {v}, cache: {self.cache}") return v print(f"get key: {key} value: None, cache: {self.cache}") return Nonecache = Cache(3)cache.add("A", 1)cache.add("B", 2)cache.add("C", 3)cache.get("A") cache.add("D", 4)
在上面的代碼中,我們定義了一個名為Cache的類,該類使用deque對象來維護一個固定長度的緩存。當我們調用Cache對象的add方法向緩存中添加新數據時,如果緩存中已經存在相同的key,則需要刪除該key對應的舊值。同時調用get方法從緩存中獲取數據時,如果數據存在於緩存中,則將其移動到緩存的左端,並返回數據的值,否則返回None。
運行上面的代碼後,我們可以看到輸出結果如下:
add key: A value: 1, cache: [('A', 1)]add key: B value: 2, cache: [('B', 2), ('A', 1)]add key: C value: 3, cache: [('C', 3), ('B', 2), ('A', 1)]get key: A value: 1, cache: [('A', 1), ('C', 3), ('B', 2)]add key: D value: 4, cache: [('D', 4), ('A', 1), ('C', 3)]
從輸出結果可以看出,當添加新數據時,如果緩存已滿,則隊列的左端會自動刪除一個元素,保證隊列的大小不超過指定的長度。在上面的示例中,我們在添加第4個元素時,由於緩存已滿,隊列的左端就刪除了最老的數據「B」。
四、總結
本文著重介紹了deque的add方法,並通過實際場景的示例代碼演示了該方法的使用。deque的add方法可以高效地維護一個固定大小的元素集合,在實時數據處理和緩存數據場景下都非常有用。如果你還沒有使用過deque,那麼現在是時候開始了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/183067.html