Python deque(maxlen): คิววงกลมที่ตัดของเก่าให้อัตโนมัติ
น้องกายEngineering
อยากเก็บล็อก/เหตุการณ์ล่าสุดแค่ N ชิ้นโดยไม่ต้องลบเองทุกครั้งใช่ไหมครับ — ในไลบรารีมาตรฐานมี collections.deque(maxlen=N) เมื่อเต็ม ชิ้นเก่าสุดจะหลุดอัตโนมัติตอน append
จุดที่ใช้บ่อย:
- หน้าต่างเลื่อนของเมตริก / log tail ในหน่วยความจำ
- BFS ที่ต้องการจำกัดความลึกคิว (ใช้ด้วยความระวัง)
appendleft/popเป็น O(1) — ต่างจากlist.pop(0)ที่แพง
import unittest
from collections import deque
class TestDequeMaxlen(unittest.TestCase):
def test_drops_oldest(self):
q = deque(maxlen=3)
for x in (1, 2, 3, 4):
q.append(x)
self.assertEqual(list(q), [2, 3, 4])
def test_appendleft(self):
q = deque(maxlen=2)
q.append(1)
q.appendleft(0)
q.appendleft(-1)
self.assertEqual(list(q), [-1, 0])
if __name__ == "__main__":
unittest.main()
Recap
- ใช้
maxlenเมื่อต้องการหน้าต่างคงที่ ไม่ใช่คิวไม่จำกัด - จำว่าของเก่าหายเงียบ ๆ — อย่าพึ่ง deque เป็นแหล่งความจริงถาวร
- อ่านdocs deque ก่อนใช้ในโปรดักชัน