uv:Astral 用 Rust 写的 Python 包管理器,目标是"Python 界的 Cargo"
阅读时间: 大约 11 分钟
uv:Astral 用 Rust 写的 Python 包管理器,目标是”Python 界的 Cargo”

在 Python 生态里,“慢”的不只是解释器,还有包管理:pip 解析依赖慢、pip-tools 锁文件繁琐、Poetry/PDM 各有一套、virtualenv 启动也要等几秒。2024 年 2 月 15 日,以极速 linter Ruff 闻名的 Astral 团队(作者 Charlie Marsh)发布了 uv——一个用 Rust 写的 Python 包解析器与安装器,并同步宣布接管 Armin Ronacher(Flask 作者)的实验性项目 Rye,把它作为通往”Python 界 Cargo”的试验田。
本文基于 uv 的官方发布博客,拆解它的性能数字、技术机制,以及那些数字背后需要打折扣的地方。
一、背景:Python 工具链的”低信心”体验
Astral 对 Python 打包现状的批评很直白:Python 工具链是一种”low-confidence experience”(低信心体验)——起一个新项目、装依赖,命令总以让人困惑的方式失败。而在 Rust 生态里,你”信任工具会成功”。uv 的愿景就是把 Python 从低信心体验带到高信心体验:单个静态二进制取代 pip、pip-tools、virtualenv,最终还要吞并 pipx、tox、poetry、pyenv、ruff。
二、它是什么:先做 pip/pip-tools 的平替
uv 的第一步很克制——不一开始就做 opinionated 的项目管理,而是先做 pip 和 pip-tools 的 drop-in 平替,挂在 uv pip 命名空间下:
| 原来的命令 | uv 替代 |
|---|---|
pip install | uv pip install |
pip-compile | uv pip compile(生成锁定 requirements.txt) |
pip-sync | uv pip sync(按锁文件同步环境) |
python -m venv / virtualenv | uv venv |
这种设计让存量项目零配置迁移。它是单个静态二进制,不依赖 Python 本身——你甚至不用先装 Python 就能装 uv,也免去了 pip/pip3/pip3.7 多版本并存的混乱。安装方式也刻意做低门槛:一行脚本(Linux/macOS)、一条 PowerShell 命令(Windows)、pip install uv 或 pipx install uv 均可,官方称已在公网 PyPI 上经过大规模测试。
三、关键性能数据
官方用 Trio 依赖、带 warm cache(模拟重建虚拟环境或给现有项目加依赖)做了对比:
| 工具 | 解析耗时 | 安装耗时 |
|---|---|---|
| uv | 0.01 s | 0.06 s |
| poetry | 0.60 s | 0.99 s |
| pip-compile | 1.56 s | — |
| pdm | 3.37 s | 1.90 s |
| pip-sync | — | 4.63 s |
换算:解析阶段 uv 比 pip-compile 快约 156 倍、比 pdm 快约 337 倍;安装阶段比 pip-sync 快约 77 倍。官方给出的概括是:无缓存时比 pip/pip-tools 快 8–10 倍,warm cache 时快 80–115 倍。
虚拟环境创建方面,官方图表给出(带 pip/setuptools 种子包的场景):uv 4.1ms、virtualenv 74.4ms、python -m venv 24.1ms。

速度来自几个工程手段:全局模块缓存避免重复下载/编译;在支持的文件系统上用 Copy-on-Write 与硬链接最小化磁盘占用;底层版本求解器用 PubGrub(Rust 实现的 pubgrub-rs)。
四、技术机制:不只是快,还补了 pip 的短板
从零写栈让 uv 能做一些 pip 做不到的事:
- 可选解析策略:默认选最新兼容版本,但
--resolution=lowest可让库作者按”最低兼容版本”测试自己的包(类似 Go 的 MVS); - 跨 Python 版本解析:
--python-version参数允许你在 Python 3.12 上生成一份 Python 3.7 兼容的解析结果,而 pip 只能针对当前安装版本解析; - 依赖 override:
-o overrides.txt可以覆盖某个包声明的依赖,作为绕过错误上限约束的逃生舱; - 标准协议的 Rust 实现:PEP 440(版本号)、PEP 508(依赖声明)、PEP 517(构建后端)、PEP 405(虚拟环境)等都有合规的 Rust 实现。
五、口径批判:那些数字要怎么读
- 80–115 倍是 warm cache 数字,冷启动只有 8–10 倍。官方特意注明这是”recreating a virtual environment or adding a dependency”的场景。如果你每次都是干净环境冷装,收益差一个数量级。
- 基准 workload 只有一个:Trio 的依赖树,且是 warm cache。不同规模、不同依赖复杂度的项目,绝对数字会变,但 uv 领先的量级大概率成立。
- 虚拟环境那段文字疑有笔误。正文写”uv 比
python -m venv快约 80 倍、比virtualenv快约 7 倍”;但按官方同页图表(无种子包场景 uv 18.2ms、python -m venv141.4ms、virtualenv1.54s)反推,uv 相对 virtualenv 约 85 倍、相对python -m venv约 7.8 倍——两个倍数正好对调。读者应以图表数字为准:uv 真正的数量级优势在对比 virtualenv 这个老牌工具上。 - “drop-in replacement”是有边界的。官方自己承认:uv 缺少
.egg分发包等 pip 的遗留特性;且还不生成跨平台无关的 lockfile——这点和 pip-tools 一致,但不如 Poetry/PDM。所以它是 pip/pip-tools 工作流的平替,不是 Poetry 的平替。 - 这是 2024 年 2 月首发时的数据。uv 此后持续迭代(长出了
uv run、uv tool、Python 版本管理等”全功能项目管理器”能力),本文数字对应首发口径,后续版本请以官方最新文档为准。
六、优势与局限
优势:
- Rust 实现,解析/安装/建虚拟环境全面快一个数量级;
- 单静态二进制、无 Python 依赖,跨 Linux/Windows/macOS,好分发;
uv pip子命令平替 pip/pip-tools,存量项目零配置迁移;- 全局缓存 + CoW/硬链接,省磁盘、省重复下载;
- 支持
--resolution=lowest、跨版本解析、override 等 pip 没有的高级能力; - 背后是做 Ruff 的 Astral,工程质量与长期投入有保障。
局限:
- 首发时不支持
.egg等 pip 遗留特性; - 首发时没有平台无关 lockfile,不是 Poetry/PDM 等价物;
- 冷缓存场景收益远小于 warm cache 宣传值;
- 从 Rye 迁移到 uv 是一个进行中的过程,Rye 用户需要等迁移路径成熟;
- 快速迭代意味着 API 与行为在早期版本间可能变动。
七、谁该关注
- 受够了 pip/pip-tools 慢的团队:把
pip-compile/pip-sync换成uv pip compile/uv pip sync几乎零成本; - CI 环境频繁重建虚拟环境的人:warm cache 下 80–115 倍的收益在 CI 上最明显;
- 需要跨 Python 版本解析、最低版本测试的库作者:
--python-version与--resolution=lowest是杀手锏; - 想要单个二进制分发的场景:容器、边缘、开发机初始化;
- 不建议:重度依赖
.egg遗留格式、或把 uv 当成 Poetry 全功能替代品的人——首发定位是 pip/pip-tools 平替。