【UV入门】UV 是什么?为什么用python的人都在用?
UV是一个Python的包管理器,和pyenv不同,pyenv是管理本机Python的版本的,而UV是管理各种版本的Python的包
一、先说说以前有多麻烦
假设你刚装好 Python,想写两个项目:
项目 A:需要 Python 3.11 和 langgraph 0.2
项目 B:需要 Python 3.12 和 langgraph 0.3
以前你要这样搞:
# 安装项目 A 的依赖
pip install langgraph==0.2
# 然后安装项目 B 的依赖
pip install langgraph==0.3
# 问题来了!项目 A 的 langgraph 被覆盖了
# 两个项目不能同时用不同版本,全挤在一起
为了解决这个问题,你需要:
# 手动创建虚拟环境
cd project-a
python -m venv .venv
source .venv/bin/activate
pip install langgraph==0.2
cd project-b
python -m venv .venv
source .venv/bin/activate
pip install langgraph==0.3
每次打开终端都要 source .venv/bin/activate,换项目还得先 deactivate,挺烦的。
二、UV 怎么解决这些问题
1. 自动帮你隔离环境,每个项目一个.venv
cd project-a
uv add langgraph==0.2 # 自动创建 .venv,安装在这里
cd project-b
uv add langgraph==0.3 # 自动创建另一个 .venv
两个项目互不干扰,版本不会冲突。
2. 不需要手动激活
# 以前要这样
source .venv/bin/activate
python app.py
# 现在直接这样
uv run python app.py
uv run 会自动找到项目里的 .venv 并运行。
3. 装东西超快
同样的依赖,以前等 30 秒,现在 3 秒。
4. 多个项目共用一份缓存
10 个项目都用 langgraph,硬盘只占一份空间,不会重复存 10 次。因为在他的依赖文件夹里,是通过硬链接的方式存储相同版本的依赖,而不是通过拷贝文件的方式.
三、你需要记住的就三件事
| 你想做什么 | 用什么命令 |
|---|---|
| 新建项目 | uv init |
| 添加依赖 | uv add 包名 |
| 运行代码 | uv run python xxx.py |
虚拟环境叫什么? 叫 .venv,UV 会自动找它,你不用管。
要不要激活? 不用,用 uv run 就行。
从 GitHub 拉了个项目怎么装依赖? uv sync
为什么大家都在用?
因为:
- 不用记
source activate这种命令了 - 不用操心版本冲突了
- 装包快得离谱
- 一个命令搞定所有事
你只需要知道 uv add 和 uv run 就够了。
四、进阶:uv比pip的优势,全局并行vs串行
虽然说uv sync可以一键安装环境,但是pip install -r requirements.txt也是可以的,pip作为更老的方案,有什么缺点呢?慢!
pip 的慢,核心在于它是一位“单线程的 Python 搬运工”;而 uv 则像是一支“多线程的 Rust 特种部队”。
uv 之所以能比 pip 快 10 到 100 倍,不仅仅是因为它用了更快的编程语言,更是因为它从底层彻底重构了包管理的整个工作流程。
下面我们从四个关键环节来对比,看看 pip 到底慢在哪里,而 uv 又是如何“降维打击”的。
🐢 依赖解析:单线程 vs 并行处理
这是最核心的速度差异来源。
-
pip(串行处理)
pip的工作方式是“走一步看一步”。当它安装一个包时,它会:- 下载这个包。
- 读取它的依赖列表。
- 然后一个接一个地去处理这些依赖。
这个过程是串行的,就像你网购时,必须等第一件商品送到,才能根据它来下单第二件。如果依赖关系复杂,pip就会陷入漫长的等待和计算中。
-
uv(并行处理)
uv使用 Rust 编写,天生就为并发而生。它会:- 同时下载所有顶层依赖。
- 在下载的同时,就开始异步地分析和解析它们的子依赖。
- 构建一个完整的依赖关系图,而不是线性地等待。
这就像你一次性把所有想买的东西加入购物车,然后系统自动并行处理所有订单,效率天差地别。
📦 下载与解压:逐个处理 vs 全局并行
-
pip(串行下载)
pip在下载包时也是串行的。它会下载一个包,解压它,然后才开始下载下一个。网络带宽和 CPU 资源无法被充分利用。 -
uv(并行下载)
uv会同时发起多个下载请求,将你的网络带宽“跑满”。下载、解压、哈希校验等所有 I/O 密集型操作都是并行执行的。
💾 磁盘安装:复制文件 vs 智能链接
这是 uv 一个非常聪明的优化。
-
pip(文件复制)
当你用pip安装一个包时,它会把所有文件从缓存目录复制到你的项目虚拟环境(.venv)中。如果你有很多项目都用同一个包(比如requests),那么磁盘上就会存在很多份相同的文件,既浪费空间又浪费时间。 -
uv(硬链接)
uv不会复制文件,而是使用硬链接。它会让项目环境里的文件直接指向全局缓存中的同一份物理文件。- 优点1:速度极快。创建链接几乎是瞬间完成的,而复制大量小文件则非常耗时。
- 优点2:节省空间。无论你有多少个项目使用
numpy,磁盘上永远只存一份numpy的文件。
🗄️ 缓存机制:简单 vs 智能
-
pip(简单缓存)
pip有缓存,但机制相对简单。有时缓存失效或损坏,就需要手动清理。 -
uv(全局内容寻址缓存)
uv拥有一个类似 Git 的智能全局缓存。它通过文件的哈希值来索引,确保缓存内容的绝对正确和高效复用。只要一个包被下载过一次,所有项目都可以瞬间“安装”它(实际上只是创建了一个链接)。
📌 总结对比
| 环节 | pip (慢的原因) | uv (快的原因) |
|---|---|---|
| 核心语言 | Python,单线程执行 | Rust,为并发和高性能而生 |
| 依赖解析 | 串行处理,走一步看一步 | 并行处理,异步构建依赖图 |
| 文件下载 | 串行下载,无法跑满带宽 | 并行下载,最大化利用网络 |
| 磁盘安装 | 复制文件,耗时且浪费空间 | 创建硬链接,瞬间完成且节省空间 |
| 缓存机制 | 相对简单 | 全局、智能、内容寻址 |
所以,pip 的慢是设计哲学和实现方式上的根本性限制。而 uv 通过使用现代编程语言和更先进的算法,对整个包管理流程进行了彻底的“性能革命”。
更多推荐



所有评论(0)