![]()
一個63KB的庫,實際占用620KB。這不是bug,是Python生態的集體盲區。
開發者Johan Lübcke花了多年時間優化代碼性能——20倍、100倍的提速他都做到過。但他最近發現,自己忽略了一個更基礎的問題:下載體積。沒人討論它,但邊緣部署和Serverless冷啟動都在為此買單。
「輕量」是個謊言:依賴樹才是真相
幾個月前,Lübcke對比了三款HTTP庫。表面數據很干凈:requests 63.4KB,httpx 71.8KB,aiohttp 1.7MB。但加上依賴后,故事完全變了——requests膨脹到620KB,httpx 560KB,aiohttp 2.6MB。
「包本身很小,但總體積完全是另一回事。」
這暴露了一個行業慣性:開發者選庫時看功能、看性能、看社區活躍度,唯獨不看「遞歸下載體積」。更麻煩的是,現有工具要么只顯示已安裝包的大小(pip list),要么需要實際安裝才能測量(pip download)。沒有工具能在安裝前給出完整的依賴樹體積。
Lübcke找了一圈,發現最接近的是pipgrip——但它只解析依賴關系,不計算體積。其他方案要么依賴本地pip子進程,要么需要真實下載文件。
「我想在安裝前就知道大小。我想看到全貌——包本身加上每一個傳遞依賴。」
零下載方案:純API架構的取舍
他最終寫了一個叫pip-size的工具。核心設計很克制:不調用pip子進程,不實際下載任何文件,純靠PyPI的JSON API獲取元數據和文件尺寸。
執行邏輯分三步:解析用戶輸入的包名和版本約束→遞歸查詢PyPI API構建完整依賴樹→累加所有wheel文件的體積。輸出格式模仿了pip的依賴樹,但每一行都帶文件大小。
以requests為例,工具會展開這樣的結構:
requests==2.33.1 63.4 KB (total: 620.4 KB)
├── idna==3.11 69.3 KB
├── certifi==2026.2.25 150.1 KB
├── charset_normalizer==3.4.7 209.0 KB
└── urllib3==2.6.3 128.5 KB
這個遞歸過程處理了邊緣情況:版本沖突時按pip的解析策略選擇最新兼容版本;遇到平臺特定wheel(如manylinux、win32)時,默認按當前平臺篩選,但提供--all-platforms開關查看全部變體。
純API方案的優勢是速度。實測解析requests的完整依賴樹耗時不到2秒,而pip download需要實際下載620KB數據,在慢速網絡下差距更大。代價是精度:PyPI API返回的是wheel文件的理論大小,實際下載后解壓到site-packages的體積會略大(通常10-20%,因為wheel是zip壓縮格式)。
Lübcke在文檔里誠實標注了這個限制:「測量的是下載帶寬占用,而非磁盤最終占用。」
為什么體積突然變得重要
高性能庫開發者關注體積,Lübcke總結了三個場景。
邊緣設備部署。樹莓派、工業網關、物聯網節點的存儲以MB計。一個宣稱「輕量」但拖入500MB依賴的庫,本質是負債。
Serverless冷啟動。AWS Lambda、Google Cloud Functions的啟動時間與包大小正相關。更小的包意味著更快的冷啟動,直接換算成更低的賬單和更好的用戶體驗。
CI管道效率。每次構建都重新安裝依賴時,體積差異被網絡延遲放大。一個團隊每天觸發幾百次構建,累積效應可觀。
這些場景的共同點是:開發者開始用基礎設施的視角審視依賴,而不再只關心功能是否work。
pip-size的GitHub倉庫在發布后一周內獲得400+ stars。一條高贊評論來自一個邊緣AI團隊:「我們之前用requests,發現鏡像體積多了600KB后換成了httpx。現在用你們的工具做預檢,省了很多回滾。」
另一個常見反饋是關于平臺特定依賴的復雜性。某些庫(如numpy、pillow)在不同平臺拉取的wheel差異巨大,Linux x86_64可能只有幾MB,而macOS arm64版本翻倍。pip-size的--all-platforms開關就是回應這類需求。
工具目前不支持conda生態,這是架構決定的——conda的元數據結構和分發機制與PyPI完全不同。Lübcke在issue里回復:「如果conda有等效的JSON API,擴展不難。但目前沒有。」
體積優化會成為Python庫的新競爭維度嗎?requests維護者在相關討論中回應:「我們在考慮拆分charset_normalizer為可選依賴,但會破壞向后兼容。」這印證了Lübcke的觀察——歷史包袱讓「減肥」比「加速」更難。
你的生產環境鏡像里,有多少空間是被「輕量」庫的隱藏依賴吃掉的?
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.