本篇文章更新時間:2025/12/27
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
內容目錄
uv 為什麼能快到嚇人?一篇理解 Python 新世代套件管理器的深度筆記
編輯前言:這篇文章來自 How uv got so fast,作者解析了 uv 為什麼能比 pip 快上十倍以上。讀完後我最大的感想是:真正拉開差距的不是 Rust,而是「更乾淨的生態標準」與「敢砍敢捨」的產品設計。
核心觀點 (Key Takeaways)
- uv 的速度來自一系列新 PEP 標準(特別是 PEP 518、517、621、658)所提供的「可靜態分析的 metadata」。
- uv 故意不支援大量 pip 的歷史包袱,讓快路徑成為預設路徑。
- 很多關鍵優化其實 pip 也做得到,但 pip 背負太多相容需求而無法取捨。
深入解析
原文一開始就破題:uv 不是因為「Rust 所以快」,而是 Python 打包生態直到 2023 年才真正具備可讓工具變快的基礎。過去依賴 setup.py 的設計讓 pip 必須「執行程式碼才能知道依賴」,導致每次安裝都像是在跑一組不確定的指令鏈。
“You couldn’t know a package’s dependencies without running its setup script.”
1. 新 PEP 標準解開歷史枷鎖
原文非常精準地指出四個關鍵 PEP:
- PEP 518:引入 pyproject.toml,第一次讓「建置依賴」可以以靜態方式揭露。
- PEP 517:讓前端工具不必理解 setuptools 內部。
- PEP 621:統一專案 metadata,依賴列表變成純資料,不需執行程式碼。
- PEP 658:把 metadata 直接放在 repository API,可在不下載 wheel 的情況讀取依賴。
這些標準在 2023 年前根本沒完全落地,所以 uv 在 2020 年是不可能存在的。這也是為什麼 Rust 並非主因,因為真正改變遊戲規則的是「生態願意標準化」。
2. uv 的速度來自它敢直接丟掉很多東西
這一段我看得非常有感。uv 的 compatibility list,本質上就是一張「我們不做 pip 在做的所有事」的清單。
像是:
- 不支援 .egg
- 不讀 pip.conf
- 預設不編譯 .pyc
- 必須在虛擬環境中使用
- 對規範更嚴,包不合法就拒絕
- 忽略 requires-python 的 upper bound
- 多重索引時只採第一個索引(避免 dependency confusion)
每一項都是 pip 不能輕易砍掉的歷史包袱,而 uv 就靠著這些刪減,把大量慢路徑完全移除。
3. 很多 uv 的優勢,其實不用 Rust pip 也能做
我特別喜歡原文這段拆解,因為它讓我重新思考「語言 vs 設計」的比例:
- 多工下載
- HTTP range request 讀取 wheel metadata
- 全域 cache + hardlink
- 解析 metadata 不用啟動 Python
- PubGrub 依賴解析器
這些 pip 理論上都可以做,只是會造成相容性斷裂,所以一直沒辦法全面導入。
4. Rust 真正能提供的,是細節層級的優化
例如零拷貝反序列化(rkyv)、無鎖資料結構、單一編譯後可執行檔、u64 版本號壓縮。這些確實漂亮,但貢獻的是額外的 10~20% 的效能,而不是十倍的差距。
筆者心得與啟發
讀完原文,我最大的感觸是:uv 的成功更像是「生態標準更新後,第一個敢徹底擺脫歷史負債的工具」的勝利。Rust 讓它更俐落,但本質是 Python 打包生態終於走到了「可靜態分析」的時代。
在產品設計上,uv 最值得學習的地方是:
- 它不是盲目相容,而是勇敢地定義「我們支援的是現代 Python 生態」。
- 它的快來自於讓 99% 的情況都走快路徑,而不是去加速慢路徑。
- 它的取捨極度清楚,沒有妥協。
如果你正在設計工具,這篇文章給我兩個啟發:
- 加入新功能比刪除舊功能容易太多,但真正的速度來自刪除。
- 語言可以帶來額外優化,但架構設計才是決定級差異因素。
讀完只會讓人更期待舊生態刷新後的新工具還會帶來哪些驚喜。
