Py学习  »  Python

2025年,Python包管理工具已经由pip变成了uv?

机器学习实验室 • 5 天前 • 53 次点击  

大家好,我是鲁工。

作为一名老Python选手,这么多年来一直都是用pip install来安装第三方库。

但最近几个月,我注意到一个现象:看到的新开源项目里,越来越多开始在README里写uv pip install而不是pip install

比如最近与Kimi K2 Thinking一起发布的Kimi CLI就是通过uv命令安装的:

uv tool install --python 3.13 kimi-cli

起初我还挺疑惑的,pip用得好好的,为什么要换?

后来我用uv尝试安装几个库,第一体验就是速度太快了,这让我大概理解了为什么现在很多开源项目都开始用uv了。

uv是什么

uv 是Astral公司开发了一款新的Python包管理工具。

提到Astral,你可能会想起他们去年发布的Ruff。那个用Rust写的Python linter,速度快到离谱,现在已经是很多项目的标配。

uv目前在Github斩获73k的star。

uv也是一样,用Rust编写。官方给出的介绍是:

An extremely fast Python package and project manager, written in Rust.

2024 年 2 月首次发布,当时的定位是更快的pip。几个月后,功能大幅扩展,变成了一个统一的Python工具链。

现在的uv,官方说可以替代pip、pip-tools、pipx、poetry、pyenv、virtualenv这一堆工具。

野心不小,但确实有点东西。

uv官方文档:

https://docs.astral.sh/uv/

uv项目地址:

https://github.com/astral-sh/uv

性能实测:快得离谱

先说性能,这是uv最吸引人的地方。

官方说uv比pip快10-100倍。一开始我觉得这数字有点夸张,但看了一些真实案例后,确实差不多。

2024年4月,Streamlit把所有用户的包管理从pip切换到了uv。

结果是什么?

平均依赖安装时间从60秒降到了20秒,应用部署时间直接提升了55%。

这不是实验室数据,是真实的生产环境,每天数万个应用在跑。

我整理了一些官方和社区的测试数据:

包安装速度对比(无缓存):

  • 安装pandas:1.22s (uv) vs 2.62s (pip) - 快 53%
  • 安装numpy + scipy + torch:3.5s (uv) vs 14.8s (pip) - 快 4.2 倍
  • 解析50+ 包的requirements.txt:5.1s (uv) vs 28.4s (pip) - 快 5.6 倍

有缓存的情况下

  • Jupyter Notebook项目解析:0.57s(冷启动)→ 0.02s(温缓存)
  • 这个速度提升就是几十倍到上百倍了

虚拟环境创建

  • uv创建虚拟环境比python -m venv快80倍
  • 比virtualenv快7倍

除了速度快,资源占用也更少:

  • CPU 使用:68% (uv) vs 92% (pip)
  • 内存占用:210MB (uv) vs 450MB (pip)

这意味着在CI/CD环境或者资源受限的机器上,uv的优势会更明显。

为什么这么快

看到这些数据,你可能会好奇:uv凭啥这么快?

首先是编程语言。

pip是用Python写的,uv用的是Rust。Rust是系统级编程语言,性能接近 C/C++。

这是基础性能差异。

其次是,uv充分利用了Rust的并发特性。

传统的pip在下载和安装包时,大部分操作是串行的。而uv可以同时处理多个依赖的下载、构建和安装。

在依赖树比较复杂的项目里,这种并发处理带来的提升非常明显。

此外,uv还有一个全局模块缓存系统。当你第一次安装一个包后,uv会把它缓存起来。下次再安装同样的包(可能是在不同的项目里),uv直接从缓存读取,甚至不需要重新下载。


而且在支持的文件系统上,uv使用写时复制(Copy-on-Write)和硬链接技术,这意味着同一个包在多个虚拟环境中共享,不会占用多倍的磁盘空间。

最后是依赖解析算法。依赖解析是包管理中最复杂的部分。uv使用了更高效的算法来解析依赖图,支持平台无关的解析,还能生成跨平台的锁文件。


这不只是快,还更可靠。

不只是快:功能全面

速度只是uv的一个卖点。让我更感兴趣的是,它想成为一个全能工具。

最基础的功能,uv可以完全替代pip:

# 传统方式pip install requests


    

# uv方式uv pip install requests

命令几乎一样,学习成本很低。

而且uv还支持很多pip没有的高级特性,比如依赖版本覆盖、更灵活的解析策略等。

首先,uv可以像Poetry一样管理整个项目:

# 初始化项目uv init my-project
# 运行项目uv run main.py
# 生成跨平台锁文件uv lock
# 同步环境uv sync

生成的lockfile确保团队成员和CI环境都用完全相同的依赖版本。

uv也可以用于Python的版本管理(替代 pyenv),这个功能让我挺意外的:

# 安装 Python 3.12uv python install 3.12
# 在当前目录下使用特定版本uv python pin 3.12

uv可以直接下载和管理Python版本,不需要额外装pyenv或 pythonbrew。

uv也可以用于工具管理(替代 pipx),比如说需要安装一个全局命令行工具?

# 安装工具uv tool install ruff
# 或者一次性运行,不安装uvx ruff check .

uvx这个命令特别方便,想临时用一个工具的时候,不需要先装到全局环境。

uv还支持单文件Python脚本的依赖管理。

你可以在脚本开头声明依赖,然后用uv run script.py直接运行,uv会自动处理依赖安装和环境隔离。

这对写一些小工具脚本非常友好。

说了这么多,不如亲自试一试。

uv安装方式如下:

macOS/Linux

curl -LsSf https://astral.sh/uv/install.sh | sh

Windows

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

uv不需要预先安装Python和Rust,安装脚本会处理所有依赖。

如果你只想把uv当作更快的pip,直接替换命令就行:

# 创建虚拟环境uv venv
# 激活环境(和之前一样)source .venv/bin/activate   # macOS/Linux.venv\Scripts\activate     # Windows
# 安装包uv pip install pandas numpy
# 导出依赖uv pip freeze > requirements.txt
# 从文件安装uv pip install -r requirements.txt

基本上就是把pip换成uv pip,其他都一样。

对于已有项目,如果需要迁移的话,可以采样渐进式迁移方式:

  1. 先在本地开发环境试用uv
  2. 验证没问题后,更新CI/CD配置
  3. 团队成员逐步切换

另外,因为uv和pip是兼容的,迁移过程中几乎不会出现环境上冲突。

个人体验

经过一段时间体验后,我现在优先选择uv来安装第三方库。最明显的感受就是快。

97ms安装一个图像处理库

以前创建新项目,装依赖要等几分钟。现在基本上就是几秒钟的事(虽然咱也不差那几分钟,但主打一个丝滑的心理体验)。

特别是在测试不同库的时候,体验提升相当明显。以前可能会因为装一次太慢而少做一些尝试,现在没这个顾虑了。

当然也会有问题。

偶尔会遇到一些包的构建问题,特别是那些有C扩展的老包。不过这种情况不多,而且一般切回pip就能解决。

另外,有些CI平台对uv的支持还在完善中,可能需要自己写一点额外的配置。

很多人问uv能不能替代Conda。

这取决于场景。

uv专注于Python包管理,对于纯Python项目,它完全够用,而且更快更轻量。

但Conda可以管理系统级依赖(比如CUDA、各种C库),在科学计算和深度学习领域,Conda还是有它的位置。

我现在的做法是:纯Python项目用uv,需要系统依赖的项目(比如 PyTorch GPU 版)还是用pip或者Conda。

uv这款工具让我重新思考了一个问题:作为开发者,我们应该对工具保持多少耐心?

以前装个依赖要等两分钟,我们习惯了,觉得这是正常的。但当有工具能在10秒内完成同样的事,你才意识到,那些等待其实是可以避免的。

这就像你的Vibe Coding工具,在没用Claude Code之前,你用其他工具觉得非常好用。但是一旦用了Claude Code之后,就很难再用回其他工具。

所以,如果你还没试过uv,我建议你可以体验一下。

装个包,创建个项目,感受一下那种丝滑的速度。



感谢您阅读我的文章。我是鲁工,八年AI算法老兵,AI全栈开发者。目前正在全面拥抱大模型和AIGC。感兴趣的小伙伴可以加我微信(louwill_)交个朋友。
图片
>/ 作者:louwill

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/189048