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 adduv 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 的工作方式是“走一步看一步”。当它安装一个包时,它会:

    1. 下载这个包。
    2. 读取它的依赖列表。
    3. 然后一个接一个地去处理这些依赖。
      这个过程是串行的,就像你网购时,必须等第一件商品送到,才能根据它来下单第二件。如果依赖关系复杂,pip 就会陷入漫长的等待和计算中。
  • uv (并行处理)
    uv 使用 Rust 编写,天生就为并发而生。它会:

    1. 同时下载所有顶层依赖。
    2. 在下载的同时,就开始异步地分析和解析它们的子依赖。
    3. 构建一个完整的依赖关系图,而不是线性地等待。
      这就像你一次性把所有想买的东西加入购物车,然后系统自动并行处理所有订单,效率天差地别。

📦 下载与解压:逐个处理 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 通过使用现代编程语言和更先进的算法,对整个包管理流程进行了彻底的“性能革命”。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐