Python 效能數據全圖:程式設計師應該知道的真實速度與記憶體成本

本篇文章更新時間: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


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon