好文翻译,原文链接
https://nesbitt.io/2025/12/26/how-uv-got-so-fast.html
Charlie Marsh在Jane Street的分享、以及Xebia的工程深度解析,已详尽拆解了相关技术细节,而uv的核心优势,集中在三大设计决策上:支撑高速执行路径(fast paths) 的行业标准、uv主动舍弃的pip兼容功能、以及无需依托Rust就能实现的性能优化。
pip的速度短板,并非代码实现的失误。多年来,Python包管理都必须执行代码,才能确定一个包的依赖项,问题的核心症结在于setup.py文件。想要获取一个包的依赖,就必须运行其setup脚本;但运行该脚本,又得先安装它的构建依赖(build dependencies)。2016年发布的PEP 518(Python Enhancement Proposal,Python增强提案,Python生态核心规范) 就明确指出这一死结:“无法在不了解setup.py依赖的情况下执行该文件,而当下尚无标准化方式,能在不执行文件的前提下自动获取这些依赖信息。”
这种鸡生蛋式循环问题(chicken-and-egg problem),迫使pip不得不反复执行“下载包→运行非可信代码→执行失败→安装缺失构建工具→重新尝试”的流程。每一次安装都可能触发大量子进程启动和任意代码执行,安装源码包(source distribution) 的过程,本质上和Linux的curl | bash执行网络脚本无异,只是多了几道冗余步骤。
这一问题的解决是分阶段落地的: PEP 518(2016)推出pyproject.toml文件,让包无需执行代码就能声明构建依赖,该TOML格式借鉴自Rust的Cargo包管理器,也让Rust工具优化Python包管理显得并非巧合;PEP 517(2017)实现构建前端与后端分离,pip无需再吃透setuptools的内部逻辑;PEP 621(2020)标准化了[project]配置表,只需解析TOML文件就能读取依赖,无需运行Python代码;PEP 658(2022)则将包元数据直接纳入Simple Repository API,解析器无需下载wheel包(Python二进制包格式,替代源码包的高效格式) 就能获取依赖信息。
PEP 658于2023年5月在PyPI(Python官方包仓库)正式启用,uv则在2024年2月发布——uv能做到高速,核心是Python生态终于有了配套的基础设施支撑,2020年的生态因缺乏相关标准,根本无法推出uv这类工具。其实其他编程语言生态早已解决该问题,Rust的Cargo从诞生就支持静态元数据,npm的package.json采用声明式设计,Python包管理标准终是追平了这些生态的水平。
速度的提升本质源于取舍,少一份执行路径,就少一份等待耗时。uv的兼容性文档,本质就是一份“不支持功能清单”:不兼容已淘汰十年的.egg旧二进制格式,pip仍在支持,uv则直接放弃;完全忽略pip.conf配置文件,省去配置解析、环境变量查询、多层级配置继承的耗时;默认跳过.py文件转.pyc字节码的编译步骤,为每次安装节省时间,用户可按需手动开启;强制依赖虚拟环境,拒绝无显式指令时改动系统Python,省去全套权限校验和安全代码;严格执行包管理规范,直接拒绝畸形违规包,减少兜底逻辑的执行;忽略requires-python的版本上限,仅校验下限,大幅减少解析器回溯次数,因这类上限多为开发者的防御性声明,并非实际兼容限制;配置多索引源时默认首个索引优先,规避依赖混淆攻击(dependency confusion attacks),也减少无效网络请求。以上每一项,都是pip必须执行、而uv直接跳过的代码路径。
uv的速度优势并非全靠Rust,多项关键优化如今就能在pip中落地:一是元数据的HTTP范围请求(HTTP range requests),uv优先读取PEP 658元数据,失败则仅请求zip包核心目录,再退而下载完整wheel包、从源码构建,高速路径覆盖99%的场景,全程无需Rust;二是并行下载,pip串行下载,uv多包并行,任意语言均可实现;三是基于**硬链接(hardlinks)**的全局缓存,uv保留一份全局包副本,通过硬链接或写时复制复用,节省磁盘空间且无需复制文件,普通语言也能实现;四是无Python依赖的解析流程,uv原生解析TOML和wheel元数据,仅遇纯setup.py包时才启动Python,摆脱了对Python解释器的强依赖;五是采用PubGrub解析算法,该算法融入SAT求解器的冲突驱动子句学习,解析复杂依赖更快、报错更清晰,pip无需重构为Rust即可接入。
部分优化确实依赖Rust的特性:一是零拷贝反序列化(zero-copy deserialization),uv通过rkyv库实现缓存数据无复制加载,数据存储格式与内存格式一致,虽其他语言有同类库,但rkyv与Rust类型系统深度融合,适配性更佳;二是线程级并行,Python的**全局解释器锁(GIL)**迫使并行任务用独立进程实现,存在通信和复制开销,Rust则原生支持线程并行,可共享内存无序列化损耗,在依赖解析环节优势显著;三是无解释器启动开销,uv是单文件静态二进制程序,无需初始化运行时,而pip每次启动子进程都要承担Python的启动成本;四是精简的版本号存储,uv将版本号打包为u64整数,超90%的版本号可存入单个u64,让版本对比和哈希计算更快,这一微优化会在数百万次操作中持续放大效果。这些都是Rust的真实优势,但影响力远不及架构级的设计取舍。
uv的极速,核心是它“舍弃了什么”,而非“用什么语言编写”。PEP系列标准的落地,让高速包管理有了基础;舍弃过时功能、严格执行规范,让高速落地成为现实;Rust只是让它的速度再上一个台阶。pip本可快速实现并行下载、全局缓存等优化,却因要兼容十五年的历史边缘场景,优先保证向后兼容,注定无法比uv更快。这也为其他包管理器提供了借鉴:采用静态元数据、无需执行代码即可获取依赖、下载前完成全量解析,才是高效包管理的核心,若生态需执行任意代码才能查依赖,效率便已落于下风。