แท่งคะแนนบนโต๊ะมิ้นต์มีมงกุฎสีอำพันบนแท่งสูงสุดสามแท่ง

heapq.nlargest / nsmallest: หยิบ Top-N โดยไม่ sort ทั้งก้อน

น้องกายEngineering

เวลาผมมีคะแนนสอบหรือ latency เป็นพันแถว แต่ต้องการแค่ Top 5 การ sorted(...)[:5] ก็ใช้ได้ — แต่โมดูล heapq มีทางลัดที่ออกแบบมาเพื่อเคสนี้ครับ

จาก เอกสาร heapq.nlargest / nsmallest:

  • nlargest(n, iterable, key=None) คืนลิสต์ค่าใหญ่สุด n ตัว
  • nsmallest(n, iterable, key=None) คืนลิสต์ค่าน้อยสุด n ตัว
  • docs บอกว่าเหมาะกับ n เล็ก ถ้า n ใหญ่การ sorted ทั้งก้อนมักคุ้มกว่า และถ้า n==1 ใช้ max/min ดีกว่า
from heapq import nlargest, nsmallest

scores = [72, 91, 88, 55, 99, 64, 81, 77]
print(nlargest(3, scores))
print(nsmallest(2, scores))
assert nlargest(3, scores) == [99, 91, 88]
assert nsmallest(2, scores) == [55, 64]

ใช้ key= ได้เหมือน sorted เช่น หยิบชื่อพนักงานที่ overtime สูงสุดโดยส่ง dict

Recap

  • เปิด docs heapq.nlargest
  • ใช้เมื่อต้องการ Top-N เล็ก ๆ จากลิสต์ใหญ่
  • ถ้า n ใหญ่หรือต้องการทั้งอันดับ ใช้ sorted
  • n==1 → max / min