iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0
佛心分享-刷題不只是刷題

正拳的 Leetcode 150系列 第 5

[Day 5] 善用 Python 的 collections - deque

  • 分享至 

  • xImage
  •  

昨天我們講到 collections 模組,今天我們來介紹 collections 模組中的 deque:double-ended queue,也就是雙端佇列。

deque 的特性是可以在兩端進行快速的插入和刪除操作,因此在一些應用場景下,比 list 更高效。當我們需要一個先進後出(LIFO, Last In First Out)的結構時,雖然 list 也可以透過 append() 和 pop(0) 來實現 LIFO,但 deque 提供了更好的性能。
為什麼使用 deque 來實現 LIFO 比 list 更好?

主要原因是 deque 的設計是為了高效地在兩端進行操作。list 在尾端操作很快,但如果要在頭部插入或刪除元素,則需要將整個列表移動,這是 O(n) 的操作。而 deque 無論是在頭尾插入或刪除元素,時間複雜度都是 O(1)。這使得它在需要頻繁操作佇列的場景中更為高效。
速度比較:list vs deque 實現 LIFO

我們來看一段程式碼,通過 timeit 模組比較 list 和 deque 在 LIFO 操作中的速度差異:

from collections import deque
import timeit
# 使用 list 來實現 LIFO
def list_lifo():
    lst = []
    for i in range(10000):
        lst.append(i)
    for i in range(10000):
        lst.pop(0)

# 使用 deque 來實現 LIFO
def deque_lifo():
    d = deque()
    for i in range(10000):
        d.append(i)
    for i in range(10000):
        d.popleft()

# 測試兩者的速度
list_time = timeit.timeit(list_lifo, number=100)
deque_time = timeit.timeit(deque_lifo, number=100)

print(f"List time: {list_time:.6f} seconds")
print(f"Deque time: {deque_time:.6f} seconds")

這段程式碼會將 10,000 個元素加入到 list 和 deque 中,然後依序移除。測試結果會顯示兩者在做 LIFO 操作時的執行時間差異。

根據這樣的測試,你會發現 deque 的速度明顯優於 list,尤其是在大量資料操作時,性能差距更為明顯。因此,在需要高效 LIFO 操作的場景中,deque 是更好的選擇。


上一篇
[Day 4] 善用 Python 的 collections - Counter
下一篇
[Day 6] 善用 Python 的 collections - OrderDict
系列文
正拳的 Leetcode 1506
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言