uv、conda、poetry对比分析

1. 本质定位差异

  • uv → 由 Astral(原 Ruff 团队)开发的超高速 Python 包管理 + 虚拟环境管理工具,定位是替代 pip + venv + pip-tools + poetry 的依赖管理部分。

  • poetry → Python 生态内主流的项目依赖管理 + 构建发布工具,偏全能型,但速度一般。

  • conda → 跨语言包管理器(Python、C/C++ 库等都能管),带自己的二进制包渠道(conda-forge、Anaconda),主要优势是科学计算依赖的二进制分发。


2. uv 相比 poetry / conda 的主要优势

(1) 极快的速度
  • 核心是 Rust 实现 + 并行下载 + 本地缓存,冷装比 pip/poetry 快数倍,热装基本秒级。

  • 官方实测:安装 100 个依赖的项目,uv 比 poetry 快 810 倍,比 conda 快 1520 倍。

第一性原理:速度取决于 IO 并发能力 + 解析算法效率。pip/poetry 都是 Python 实现,单线程解析,uv 用 Rust 并发解析 + 请求,效率差距天然存在。


(2) 与 pip 完全兼容
  • poetry 有自己的依赖解析器和 lock 格式,和 pip 不是完全兼容;conda 更是独立体系。

  • uv 支持直接读写 pyproject.toml、requirements.txt,无额外格式锁定,方便和现有 pip 流程混用。

  • 可以用 uv pip install 无缝替代 pip,但享受 uv 的速度和缓存。


(3) 内置跨项目共享缓存
  • 安装的 wheel/sdist 缓存是全局的,不同项目重复依赖无需重新下载/构建。

  • poetry 的缓存范围较小,conda 虽然有缓存,但 channel 更新时会触发大量重新下载。


(4) 单文件可执行,零环境依赖
  • uv 是单独的二进制文件(类似 ripgrep、fd),直接下载运行,不依赖 Python 预安装。

  • poetry 自身需要 Python 运行环境,conda 则要安装 Anaconda/Miniconda 体积很大。


(5) 高效锁定与解析
  • uv 的解析器(基于 Rust)能在毫秒级完成依赖树解析并生成 uv.lock。

  • poetry 的解析是 Python 实现,对复杂依赖树(尤其是冲突检查)会慢很多。

  • conda 解析复杂环境时(尤其混合 python+非python包)非常慢。


(6) 轻量化 & 单一职责
  • uv 目标是“快速安装、解析、锁定、运行”,构建/发布功能交给成熟工具(如 hatch、setuptools)。

  • poetry 集成了构建/发布,功能多但容易卡在某个子模块更新慢的问题。

  • conda 则功能更多,但在纯 Python 项目中显得过重。


3. 对比表

维度 uv poetry conda
实现语言 Rust Python Python/C 混合
安装速度 极快(秒级) 中等(pip 级别) 慢(解析耗时长)
依赖解析 Rust 并发解析 Python 单线程解析 SAT 求解器,慢但支持跨语言
缓存机制 全局共享缓存 项目级+有限全局 全局,但更新容易触发重下
与 pip 兼容性 完全兼容 部分(lock 不兼容) 基本不兼容
二进制分发 依赖 PyPI wheel 依赖 PyPI wheel 内置二进制(科学计算友好)
适合场景 现代 Python 项目,追求极致速度 全能型 Python 项目管理 跨语言依赖、大型科学计算
构建/发布 无(交给 hatch 等) 内置 无
安装体积 单二进制,小 依赖 Python Anaconda 大,Miniconda 中等

4. 关键洞见

  1. uv 是 Python 依赖管理的“加速器”,不是全能替代品,如果你的项目还需要构建/发布,可能需要配合 hatch、setuptools 等。

  2. conda 的核心价值是非 Python 库的二进制分发,在纯 Python 场景反而累赘。

  3. poetry 在“开发体验一体化”上依然有价值,比如版本管理、发布流程集成,但速度被 uv 完爆。

  4. uv 现在正处于功能扩展期,未来可能接近 poetry 的一体化,但现在更适合“高性能依赖安装/解析”任务。


5. 常用命令大全

# 创建虚拟环境
uv venv --python=3.12
uv venv --python=3.10

# 激活虚拟环境
# For macOS/Linux
source .venv/bin/activate
# For Windows
.venv\Scripts\activate

# 离开虚拟环境
deactivate

# 虚拟环境安装包,但不会写入到工程依赖中【不推荐】
uv pip install xxx

# 用uv init来完整地管理它的相关环境依赖,项目相关的依赖都会明明白白地写在项目的配置文件中,后面在不同的机器上也能够很快地搭建起这个环境。
uv init .

# uv add等同于uv pip install,且会写入到工程依赖中
uv add xxx

# uv remove等同于 uv pip uninstall,且会将xxx包从工程依赖中移除
uv remove xxx

# 查看工程依赖包的树状结构
uv tree

# 同步锁定依赖(高级用法)根据 requirements.txt 或 requirements.lock 精确安装依赖,保持团队环境一致
uv sync

6. 注意事项

(1) 在项目中更新依赖包并同步更新uv.lock/pyproject.toml

在使用 uv 管理 Python 项目依赖时,如果要引入或更新一个包,并保证 uv.lock 与 pyproject.toml 同步更新,可以按以下两种情况处理:


不知道目标包的具体版本号

以 langgraph 为例,有两种方法:

方法一(推荐)

直接移除再添加,让 uv 自动解析最新版本并写入配置:

uv remove langgraph
uv add langgraph

方法二(不推荐)

利用 uv lock –upgrade-package 升级锁文件:

uv lock --upgrade-package langgraph
uv sync

缺点:此方法只会更新 uv.lock,不会同步更新 pyproject.toml,容易导致配置不一致。


已知目标包的具体版本号

显式指定版本更新:

uv add langgraph==0.6.2

这样会同时更新 pyproject.toml 和 uv.lock,保证依赖版本锁定一致。


💡 小贴士

  • uv add 会自动处理安装、依赖解析和配置文件更新,是 uv 最推荐的依赖变更方式。

  • 避免手动改 pyproject.toml 再运行 uv lock,因为容易遗漏同步步骤。

  • 如果想一次升级多个包,可用:

uv remove 包1 包2 && uv add 包1 包2