uv 评测:一个 Rust 写的 Python 包管理器,到底快在哪
一个使用 Rust 编写、速度极快的 Python 包与项目管理器。
秒懂
- 它是什么?
- uv 用 Rust 重写了 pip、pip-tools、pipx、poetry 等工具链,声称比 pip 快 10 到 100 倍。本文基于其 README 和文档,拆解它的核心机制、适用场景和真正的边界。
- 适合谁用?
- uv 适合那些受够了 pip 解析速度、需要跨平台锁文件、或者想用一个工具管理 Python 版本、项目依赖和 CLI 工具的开发者。它不适合那些重度依赖 pip 私有扩展、或者项目必须停留在 Python 3.8 以下的环境。
- 能商用吗?
- 可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
- 还在维护吗?
- 在维护。仓库在最近一天内有新的提交。
- 用什么语言写的?
- 主要是 Rust(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。
开源项目深度解析
它解决的是工具链碎片化,而不只是速度
Python 生态的包管理一直是一堆工具的拼图:pip 负责安装,pip-tools 负责锁定版本,pipx 跑命令行工具,poetry 管项目依赖,pyenv 管 Python 版本。每个工具都有自己的配置格式和心智负担。uv 的目标是用一个二进制取代这串名单。README 里列出的替代对象包括 pip、pip-tools、pipx、poetry、pyenv、twine 和 virtualenv。这意味着你不再需要为了不同任务记住不同的 CLI 语法。它用 Rust 实现,所以安装本身不依赖 Python 环境,curl 脚本或者 pip 都能装。对于新项目,你只需要一个 uv 命令,就能完成从创建项目、添加依赖、创建虚拟环境到运行脚本的全过程。这种整合本身就是一种价值,哪怕速度没有宣传的那么夸张。
从解析到缓存:速度来自哪里
uv 声称比 pip 快 10 到 100 倍,这个数字来自项目仓库里的 BENCHMARKS.md,但我们没有验证过。不过从机制上能看出一些端倪。它用 Rust 重写了依赖解析和安装逻辑,绕过了 pip 的 Python 实现。更重要的是它有一个全局缓存,所有项目和虚拟环境共享同一份下载的包,磁盘上只存一份,安装时直接硬链接或复制。README 里展示的示例中,uv add 解析 2 个包花了 170ms,安装花了 1ms,uv lock 解析只用了 0.33ms。这些数字是在干净环境中跑的,真实项目依赖多时不会这么快,但缓存的收益会随使用次数累积。另一个关键设计是平台无关解析,uv pip compile 可以生成 universal 的 requirements.txt,意味着你在 macOS 上解析,生成的锁文件在 Linux 和 Windows 上也能用。这解决了团队协作时常见的“我这边装不上”的问题。
项目、脚本、工具:三种工作流的统一入口
uv 把三种常见的 Python 使用场景统一到一个命令之下。项目场景用 uv init 创建目录,uv add 添加依赖并自动生成 .venv,uv lock 生成锁文件,uv sync 同步环境。脚本场景则是给单文件脚本添加内联依赖元数据,uv add --script example.py requests 会修改脚本头部,之后 uv run example.py 会在隔离环境里安装依赖并执行。工具场景对应 pipx,uvx pycowsay 直接在一个临时环境里运行工具,用完即弃;uv tool install ruff 则把工具装到用户级目录,产生一个可执行文件。三种工作流共享同一个缓存和解析器,所以一旦你熟悉了 uv 的语法,就不需要再切换工具。不过要注意,脚本的内联依赖格式是 uv 自己的约定,如果你把脚本分享给不用 uv 的人,对方需要手动处理这些依赖声明。
Python 版本管理:内置的 pyenv 替代品
uv 可以直接安装和管理 Python 解释器。uv python install 3.12 3.13 3.14 会在几秒内下载并安装多个版本,然后通过 uv python pin 3.11 把当前目录的 .python-version 文件固定到指定版本。uv run --python pypy@3.8 甚至能指定非 CPython 的实现。这意味着你不再需要单独安装 pyenv 或者手动管理 PATH。但要注意,这个功能依赖 uv 自己的下载源,它从 python.org 或 Astral 维护的构建镜像获取解释器。如果你的网络环境无法访问这些源,或者你需要的是系统自带的 Python 版本(比如 CentOS 自带的 2.7),uv 不会用它,除非你显式指定。另外,uv 管理的 Python 是独立的,它不会影响系统 Python,这既是隔离的优点,也意味着如果你有其他工具依赖系统 Python 的路径,可能需要额外配置。
pip 兼容接口:迁移的缓冲垫
uv 没有强迫你放弃现有工作流。它提供了一个 uv pip 子命令,几乎可以逐字替换 pip、pip-tools 和 virtualenv 的命令。README 里给出 uv pip compile requirements.in --universal --output-file requirements.txt 和 uv pip sync requirements.txt 的示例,这在 CI 里可以直接替换 pip install -r requirements.txt。这个接口的好处是,你不需要重写任何配置文件,只需要把命令前缀从 pip 改成 uv pip。但要注意,uv pip 并不完全等价于 pip,它不支持 pip 的所有私有扩展,比如某些 pip 的 --find-links 行为可能不同。如果你依赖 pip 的某些边缘特性,迁移前需要测试。这个接口更像是给团队一个渐进式迁移的路径:先在一个项目里试用 uv pip,验证无误后再切换到 uv 的项目管理功能。
锁文件与工作区:适合中大型项目
uv 的锁文件是通用的,意味着它记录了解析时的平台信息,可以跨平台复用。这比 pip-tools 生成的 requirements.txt 更严谨,因为后者通常只针对当前平台。uv 还支持 Cargo 风格的工作区,这意味着你可以在一个仓库里管理多个 Python 项目,它们共享一个锁文件,依赖可以互相引用。这解决了 monorepo 里常见的依赖重复问题。但工作区功能也有学习成本,你需要理解 workspace 的成员定义和依赖解析规则。如果你只是一个小项目,用不到工作区,但锁文件本身已经比 requirements.txt 更可靠。值得注意的是,uv 的锁文件格式是 uv 特有的,它不是标准的 requirements.txt,所以如果你的 CI 或部署工具不认这个格式,你需要用 uv export 导出标准格式。README 里没有提到这个命令,但文档里有,需要的话得去查。
维护与升级:Rust 二进制的双面性
uv 是 Apache-2.0 许可的开源项目,由 Astral 公司维护,这家公司也是 Ruff 的创造者。从发布频率看,0.12.5 到 0.12.7 相隔不到两周,说明迭代很活跃。安装方式上,如果你用 curl 脚本安装,uv self update 可以自动升级到最新版。但如果你用 pip 安装,升级就得靠 pip 自己,而且 pip 安装的版本可能滞后。Rust 二进制的优势是启动快、内存占用低,但劣势是如果你的系统架构不在官方支持列表里(比如某些 ARM 设备),你可能需要自己编译,那会花不少时间。另外,uv 的快速发展也意味着 API 和 CLI 可能变化,升级大版本时可能需要调整脚本。好在 uv 的文档比较完善,命令行有 uv help 可以随时查看。
真正的局限:不是银弹
uv 最明显的局限是它无法解决所有 Python 打包问题。比如,它不支持某些需要编译的包在解析时进行平台判断,虽然 universal 锁文件能跨平台,但如果你依赖的包只在某些平台有 wheel,uv 可能会在安装时报错。另一个问题是对私有索引的支持,uv 支持自定义索引,但配置方式与 pip 不同,如果你有复杂的内部 PyPI 镜像,迁移需要额外配置。还有一个隐藏成本:uv 的全局缓存会占用磁盘空间,虽然它做了去重,但如果你管理很多项目,缓存可能达到几个 GB。最后,uv 是 Rust 写的,这意味着它的二进制体积比纯 Python 工具大,首次下载可能需要几秒,但相比它节省的时间,这可以接受。
替代方案:与 rye 和 poetry 的差异
如果你不想用 uv,最接近的替代是 rye,它同样由 Astral 团队开发,但用 Python 实现,功能上更偏向项目管理,没有 uv 的 pip 兼容接口。poetry 是老牌的项目管理工具,它有成熟的依赖解析和发布流程,但速度远不如 uv,而且它的锁文件不是通用的,跨平台时可能出问题。pip-tools 加上 pyenv 的组合也能达到类似效果,但你需要维护两个工具,而且没有统一的缓存。uv 的核心差异在于:它把所有功能整合到一个 Rust 二进制里,并且提供了 pip 兼容层,这意味着你可以逐步替换,而不是一次性革命。如果你已经深度使用 poetry,迁移到 uv 需要重写 pyproject.toml 的某些部分,因为 uv 对构建系统的要求不同。
结论:谁该用,谁该等
uv 适合那些追求速度、想要统一工具链、或者需要跨平台锁文件的团队。它尤其适合新项目,因为初始化成本低,uv init 一条命令就能开始。对于已有项目,建议先用 uv pip 接口替换 pip,验证依赖解析的兼容性,再考虑迁移到 uv 的项目管理。不适合的人群包括:依赖 pip 私有扩展的、需要支持 Python 3.8 以下版本的(uv 的最低支持版本是 3.8,但某些新特性可能要求更高)、或者无法接受 Rust 二进制体积的嵌入式环境。采用前需要验证的点是:你的依赖树是否包含本地路径包或私有索引,uv 的解析器是否能正确处理。如果这些都没问题,uv 值得成为你的默认工具。
编辑结论
uv 适合那些受够了 pip 解析速度、需要跨平台锁文件、或者想用一个工具管理 Python 版本、项目依赖和 CLI 工具的开发者。它不适合那些重度依赖 pip 私有扩展、或者项目必须停留在 Python 3.8 以下的环境。在采用前,先验证两点:其一,你的依赖树是否包含 uv 无法解析的本地包或私有索引;其二,团队是否接受将 .venv 和锁文件作为唯一事实来源。如果这两点都能通过,uv 值得作为默认工具引入,否则建议先在单个项目中试用 uv pip 接口,再决定是否全量切换。
社区笔记