試用新世代的 Python 套件管理工具 - uv
什麼是 uv?
在介紹 uv 前,必須提到開發的公司 Astral,也就是開發大名鼎鼎的 Python formatter ruff 的公司。他們的野心就是要打造 Python 生態系中最好用的工具。
uv 就是由 Astral 開發的新一代 Python 套件與環境管理工具。
特色是用 Rust 寫的,主打極高速、低記憶體用量,並且把傳統上要用多個工具才能完成的功能(例如 pip、pip-tools、pipx、virtualenv、pyenv)整合到同一個 CLI 中。
簡單說,uv 讓你可以:
- 管理相依套件及 lock file(pyproject.toml / uv.lock)
- 建立與管理虛擬環境
- 安裝與切換 Python 版本
- 安裝 CLI 工具(類似 pipx)
- 發佈套件到 PyPI
一起來回顧目前在開發 Python 應用程式時的作法
如果不使用 Docker 或是 VS Code Dev Containers 開發的話,應該不會和下面這個流程差太多。
Step 1: 需要先指定 Python 版本,可能用 pyenv、pipenv 或 conda 來鎖定 Python 版本。
Step 2: 如果前一步的工具沒有附帶虛擬環境,可能就要再使用 Python venv、virtualenvwrapper 或是 poetry 這樣的工具來建立虛擬環境。
Step 3: 套件管理工具如 pip、poetry、conda 開始幫你解析並安裝相依套件。
如果使用 poetry 的話,至少要搭配 pyenv 來一起使用,稍嫌麻煩。
uv 的優勢
相信有過自行管理 Python 虛擬環境的人應該都能體會這有多麻煩,而 uv 的優勢就不言而喻了。
uv 讓我們可以:
- 用極快的速度安裝專案需要的套件,特別利於在 CI/CD 需要 build image,或是需要多環境的測試下減少大量的時間。
- 在一個新環境或專案中不用頻繁地安裝切換工具,學習成本變低,提升開發者體驗(DevEx)。
- 遵守 PEP 518/621,使用
pyproject.toml來管理相依套件,即使哪天不想用 uv,也能快速切換到支援pyproject.toml的工具如 poetry。
uv 常用的指令
安裝 uv(macOS / Linux)
1 | |
初始化專案
1 | |
安裝/同步套件
1 | |
如果拿到別人給的 pyproject.toml 有更新,可以使用以下指令同步相依套件:
1 | |
uv sync 會根據 pyproject.toml 和 uv.lock 的內容,安裝或更新專案所需的所有相依套件,確保環境與設定檔一致。
執行程式
1 | |
安裝特定 Python 版本
1 | |
設定專案使用版本
1 | |
輸出成 pip 可以使用的 requirements.txt
1 | |
比較 uv 和 pip 的安裝速度
分別用 pip 和 uv 來安裝 pandas:
從上圖可以看到,pip 的安裝速度相對較慢,特別是在解析相依套件時。
而使用 uv 時,安裝速度明顯更快,特別是在處理相依套件的解析與安裝過程中,速度提升了 40 倍。
測試 uv 在 Docker 中的表現
底下三個測試都用差不多的 Dockerfile,差別只在安裝 Python 套件的方式。
Case 1: 使用 uv pip
1 | |
Case 2: 使用 uv sync
1 | |
Case 3: 使用 pip
1 | |
從這個測試可以看到,不論是使用 uv pip 或是 uv sync,花費的時間都是差不多的,而且遠快於直接使用 pip 安裝。
結論
uv 最近是社群炙手可熱的套件,其優異的效能以及開發體驗讓很多開發者直接愛上。建議大家都體驗看看,如果真的有遇到問題,退回去使用 poetry 也不會是很困難的一件事。