
一个用 Rust 重写的 Python 包管理器,把 pip、virtualenv、pyenv、pip-tools、pipx 五件套合并成一个二进制,依赖解析快到离谱。你是不是也遇到过这种情况:新拉一个 Python 项目,敲下 pip install -r requirements.txt,然后眼睁睁看着转圈圈转了 90 秒,三杯咖啡都喝完了,依赖还没装完。更离谱的是,等它终于装完,你换台电脑再装一遍,又得重新转 90 秒。同一个项目,同样 23 个包,pip 每次 6.6 秒起跳,大项目直接奔着一分半去了。
Python 这套工具链,碎片化到让人怀疑人生。uv 的出现,就是来终结这个问题的。
一、Python 工具链,五件套的混乱
先说说为什么 Python 装包这件事会这么折磨人。写 Python 这些年,你大概率装过这一堆东西:• pip:装包用• virtualenv 或 venv:搞虚拟环境• pyenv:管理多个 Python 版本• pip-tools:生成锁文件、冻结依赖• pipx:装 CLI 工具五个工具,五种用法,五份配置文档。新人入职第一天光配环境就得耗一上午。更糟的是这五个工具彼此不怎么说话。pyenv 装的 Python 版本,virtualenv 不一定认得;pip-tools 生成的锁文件,pip 装 的时候还是可能版本漂移;pipx 跟前几个完全不搭嘎。
这不是工具链,是工具山。我自己就踩过坑:项目里明明锁了 pandas==2.1.4,CI 上跑出来却是 2.1.5。排查半天发现是 pip 的依赖解析器在某些 corner case 下会"自作主张"地升级小版本。更别说速度了。pip 是纯 Python 写的,单线程,解析依赖的时候要一个一个去 PyPI 拉元数据。包一多,I/O 就成了黑洞。官方文档里有一句很扎心的话:Python 的包管理体验,落后 Rust/Node 生态至少五年。
二、uv 登场:Rust 重写、一个二进制搞定
uv 是 Astral 团队搞的。这团队名字你可能不熟,但他们另一个项目你肯定听过——Ruff,那个用 Rust 写的、快到飞起的 Python linter。Ruff 一战成名之后,Astral 团队把目光瞄准了 Python 包管理这个老大难。他们的思路很暴力也很有效:用 Rust 把上面那五件套的逻辑,全部重写一遍,塞进同一个二进制文件里。结果就是 uv。一个不到 30MB 的单文件,干掉了原来五个工具的活,还快了 10 到 100 倍。
uv 不是更快的 pip,是替代整套工具链。它干的事包括:• 装包(替代 pip)• 创建虚拟环境(替代 virtualenv/venv)• 管理 Python 版本(替代 pyenv)• 生成统一锁文件(替代 pip-tools)• 跑脚本、装 CLI 工具(替代 pipx)一份配置,一个命令,一套逻辑。这才是 2026 年该有的样子。
三、到底有多快?数据说话光说快没用,看数据。下面这几组对比数据来自 uv 官方 benchmark和社区实测,跑的是真实场景:• 创建虚拟环境:uv 0.008 秒,python -m venv 1.15 秒。快 143 倍。• warm cache 装 23 个包:uv 0.12 秒,pip 6.6 秒。快 55 倍。• 冷启动装 Django+Celery+Pandas+scikit-learn 大项目:uv 约 8 秒,pip 约 90 秒。快约 10 倍。
0.008 秒是什么概念?比你眨一下眼还快。等你按下回车键的机械行程还没结束,虚拟环境已经建好了。我自己实测过一组对比:把一个有 87 个依赖的中型项目从零装起来,pip 跑了 2 分 40 秒,uv 跑了 11 秒。中间我都不用起身倒水,刚敲完命令结果就出来了。
从"够泡一杯咖啡"到"咖啡还没凉"。这个速度差异的根源,是 Rust + 并发。uv 用 Rust 写依赖解析器,多线程并发去 PyPI 拉元数据,再用全局硬链接缓存避免重复下载同一个包。同一个包在你机器上只存一份,每个项目都是硬链接过去,零拷贝。
四、亮点功能:不止是快
uv 的杀手锏不只是速度。它把很多本来需要"配好几样东西才能跑起来"的流程,做成了开箱即用。
1. 统一锁文件
以前用 pip-tools,要手动跑 pip-compile 生成 requirements.txt,再 pip-sync 同步。uv 直接用 uv.lock,一个文件锁定整个项目所有平台的依赖,Windows、Linux、macOS 全覆盖。uv lock # 生成/更新锁文件uv sync # 按锁文件同步环境锁文件是跨平台的。CI 上跑 Linux,本地是 macOS,装出来的版本完全一致。再也不用担心"我机器上能跑"这种鬼话。
2. Cargo 风格的 workspace
如果你做过 Rust 开发,肯定用过 Cargo 的 workspace——一个仓库里有多个子项目,共享一套依赖。uv 把这套搬到了 Python。uv init --workspace my-monorepo一个 monorepo 里多个 Python 包,共享依赖、统一锁文件、独立构建。这对做 SDK、做平台型项目的团队简直是救命。
3. 内联依赖脚本运行
这个功能是我个人最爱的。写个一次性脚本要用 httpx 和 rich,以前得:建环境 → 装包 → 跑脚本 → 删环境。现在直接:# script.py# /// script# dependencies = ["httpx", "rich"]# ///import httpx, rich...然后 uv run script.py,uv 会自动建个临时环境、装好依赖、跑完脚本、清理掉。一行命令搞定,干净利落。
4. 自动管理 Python 版本
pyenv 可以退休了。uv 内置 Python 版本管理,uv python install 3.12 直接装好,项目 .python-version 文件指定版本,uv 自动下载、自动切换。uv python install 3.12 # 装 Python 3.12uv python pin 3.12 # 给当前项目固定版本不需要再 pyenv local、pyenv shell 一堆命令,uv 全包了。
5. pip 兼容 CLI
这点对老项目迁移特别友好。uv 提供了 uv pip 子命令,跟原生 pip 接口几乎一致:uv pip install -r requirements.txtuv pip install requestsuv pip freeze老项目可以直接 alias pip=uv\ pip,零改造享受 10 倍加速。
6. 全局硬链接缓存省磁盘
这个前面提过,单独说一下因为太实用了。uv 在你机器上有个全局缓存目录(默认 ~/.cache/uv),同一个版本的包只下载一次。每个项目用到的时候,是硬链接过去,不是复制。意思是:你有 10 个项目都用 numpy,磁盘上只占一份空间。装 100 个项目,省下的磁盘可能几十个 G。
五、上手用:从安装到跑通
讲这么多亮点,不如直接动手。下面是从零到跑通一个 uv 项目的完整流程。
安装
macOS / Linux 一行:curl -LsSf https://astral.sh/uv/install.sh | sh或者用 Homebrew:brew install uv或者直接 pip 装(虽然有点讽刺,但确实可以):pip install uv装完验证一下:uv --version
新项目从零开始
uv init my-project # 创建项目结构cd my-projectuv add requests # 加依赖uv run main.py # 跑脚本四个命令,从零到一个能跑的项目。uv init 会生成 pyproject.toml、.python-version、uv.lock,uv add 自动建虚拟环境、装包、更新锁文件,uv run 在隔离环境里跑你的代码。不需要 python -m venv,不需要 source venv/bin/activate,不需要 pip install。一套命令走到底。
老项目迁移
老项目更简单。进项目根目录:uv venv # 建虚拟环境uv pip install -r requirements.txt # 装老依赖uv add --requirements requirements.txt # 转成 uv 锁文件或者更暴力:alias pip=uv\ pip然后照常用,速度直接 10 倍。迁移成本几乎为零。
跑一次性脚本
前面讲过的内联依赖脚本,实操一下:# fetch.py# /// script# dependencies = ["httpx", "rich"]# ///import httpxfrom rich import print resp = httpx.get("https://api.github.com")print(resp.json())uv run fetch.py第一次跑会下载 httpx 和 rich,第二次跑直接命中缓存秒出。整个过程不用 venv、不用 pip install、不用清理。
六、我的真实体验
用 uv 大半年了,说说实际感受。最大的变化不是速度,而是心智负担。以前开新项目,要想着"先建 venv、再激活、再 pip install、再 pip-compile 锁版本",每一步都得记命令。现在 uv init + uv add + uv run 三件套,肌肉记忆。CI 时间砍掉一大半。我们有个项目原来 CI 装依赖要 3 分 20 秒,换成 uv 之后 22 秒。一个月省下来的 CI 时长,够团队多跑几百次部署。新人入职配环境从 1 小时缩短到 5 分钟。以前要装 pyenv、装多个 Python 版本、装 virtualenvwrapper、配 pip 镜像源、再 pip install。现在就一句 curl ... | sh,完事。
工具好不好,看它有没有让你忘掉它。uv 就属于这种。装完之后,你基本感觉不到它的存在——因为再也不用为包管理这件事分神了。有人预测,2026 年 uv 已经成为 Python 包管理的事实标准。从我身边的体感看,这话不夸张。新启动的项目,十个有八个用 uv;老项目也在陆续迁移。
七、什么场景该上 uv
不是所有场景都需要立刻换,给你几个判断标准:新项目,无脑上 uv。 没有任何历史包袱,从第一天就用 uv,整个项目生命周期都不用碰包管理的烂事。老项目,CI 慢的优先换。 CI 是最痛的地方,换 uv 收益最大、风险最小。本地开发可以慢慢迁。做 SDK / 库的,强烈建议换。 uv 的 workspace 和统一锁文件,对多包仓库特别友好。发布到 PyPI 也用 uv publish,一条龙。临时脚本党,必须用。 内联依赖脚本功能,省下你无数次建临时环境的时间。唯一的"缺点"是:uv 是新工具,生态里偶尔会遇到边角 bug。但 Astral 团队迭代极快,GitHub 上 issue 响应很积极。我遇到过的几个小问题,都在一两周内修掉了。
八、一句话总结
Python 这几年最值得装的,不是哪个第三方库,是 uv 这个工具本身。它把碎片化的五件套合并成一个二进制,把 90 秒压到 8 秒,把"配环境一下午"变成"配环境五分钟",把工具山铲平成一个命令。
装包这件事,本来就不该是问题。如果你还在被 pip 折磨,今晚就试一下 uv。装上之后跑一遍你手头最慢的那个项目,对比一下时间。我赌你不会再回去。curl -LsSf https://astral.sh/uv/install.sh | sh就这一行命令的事。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14573/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料