นากกายดันกล่องเข้าคิววงกลมบนโต๊ะมิ้นต์ กล่องเก่าหล่นออกด้านท้าย

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 ก่อนใช้ในโปรดักชัน