大家好,我是鲁工。
作为一名老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倍
除了速度快,资源占用也更少:
- 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 pip install requests
命令几乎一样,学习成本很低。
而且uv还支持很多pip没有的高级特性,比如依赖版本覆盖、更灵活的解析策略等。
首先,uv可以像Poetry一样管理整个项目:
# 初始化项目uv init my-project
# 运行项目uv run main.py
# 生成跨平台锁文件uv lock
# 同步环境uv sync
生成的lockfile确保团队成员和CI环境都用完全相同的依赖版本。
uv也可以用于Python的版本管理(替代 pyenv),这个功能让我挺意外的:
uv 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 .venv\Scripts\activate
uv pip install pandas numpy
uv pip freeze > requirements.txt
uv pip install -r requirements.txt
基本上就是把pip换成uv pip,其他都一样。
对于已有项目,如果需要迁移的话,可以采样渐进式迁移方式:
另外,因为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_)交个朋友。