本篇文章更新時間:2026/01/02
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
Python 效能數據全圖:日常程式碼背後的真實成本
副標題:深入拆解《Python Numbers Every Programmer Should Know》的核心洞察
編輯前言:如果你寫 Python 卻從未真正理解「哪些操作快、哪些操作慢」,這篇文章會讓你重新校準直覺。這些數字不只是 trivia,而是打造更快、更省記憶體、更穩定系統的基礎。
核心觀點(Key Takeaways)
- Python 物件比想像中「佔更多記憶體」,例如空字串要 41 bytes、空 list 56 bytes。
- dict 與 set 的查詢速度極快,對比 list membership 高出百倍。
- JSON 標準庫很慢,orjson/msgspec 至少快 3~8 倍。
- async 並不是免費:建立 coroutine 的成本高,無 I/O 的 async 比 sync 慢很多。
- slots 類別能節省超過 2 倍記憶體,而且不會犧牲存取速度。
深入解析
這篇原文(Python Numbers Every Programmer Should Know)整理了 Python 世界裡最常用但最容易被忽略的性能事實。我在閱讀時最大的感受是:Python 的設計哲學是「便利勝過輕量」,因此了解底層成本,才能真正知道什麼時候該換資料結構、什麼時候該避免不必要的 abstraction。
以下我把幾個印象最深刻的點拆成兩大區塊:記憶體與速度。
-
記憶體:你以為便宜,其實很貴
原文指出:「Empty string = 41 bytes」,這比多數人直覺的 1~2 bytes 多出好幾倍。原因在於 Python 必須保存 PyObject header、reference counting 等資訊。因此: -
小整數(0~256)大小為 28 bytes
-
float 為 24 bytes
-
空 list:56 bytes
-
空 dict:64 bytes
最讓我驚訝的是 class instance。
Regular class (5 attrs) = 694 bytes ; slots = 212 bytes
單個沒有感覺,但當你有 10 萬個物件,差距會是數百 MB 的等級。
- 速度:不同資料結構的差距比你想得巨大
原文使用一個經典例子:list membership。
item in list (1,000 items) = 3.85 μs
item in set = 19 ns
這表示 set 比 list 在 membership 查詢上 快了 200 倍。我在做 API 驗證或資料查找時經常寫「if x in list」,看完這個表之後再也不敢隨便用了。
筆者心得與啟發
這篇文章讓我再次體會:效能不是靠猜的,而是靠理解與測量。
幾個我認為對日常 Python 寫作最有幫助的心得:
- 能用 set/dict 就不要用 list 當索引查詢,這是最立即能帶來百倍效能提升的習慣。
- 大量物件請優先考慮 slots 或 dataclass(slots=True),記憶體效益太明顯了。
- JSON 序列化請改用 orjson 或 msgspec,效能差距大到不需要猶豫。
- async 不是萬靈丹。若不是 I/O-bound 工作,async 的額外成本反而會拖慢速度。
- 不要過度懼怕 nanosecond 級的操作。像 len() 或小型字串操作都非常快,與其過度優化,倒不如專注於資料結構與 I/O。
整體來說,這篇文章很值得所有 Python 工程師收藏。當你對語言底層的性能輪廓越熟悉,寫出來的程式就越穩定、越高效,而且你對「要不要優化」的判斷也會更準確。
若你想自己動手測試,原文也附上 GitHub 程式碼:https://github.com/mikeckennedy/python-numbers-everyone-should-know
