Skip to content

Commit 98f767d

Browse files
committed
update info
1 parent afbc150 commit 98f767d

2 files changed

Lines changed: 230 additions & 1 deletion

File tree

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
---
2+
title: 现代化的包管理工具:uv
3+
date: 2025-04-29 22:21:37
4+
tags: 技术知识
5+
categories: 技术知识
6+
keywords:
7+
description: 秋招正式批拼多多技术面试分享。
8+
top_img: https://gcore.jsdelivr.net/gh/CoderJackZhu/bloggallery/img/9df566a73df3459ced3a41e6a9b124c4.jpeg
9+
comments: true
10+
cover: https://gcore.jsdelivr.net/gh/CoderJackZhu/bloggallery/img/9df566a73df3459ced3a41e6a9b124c4.jpeg
11+
toc:
12+
toc_number:
13+
copyright:
14+
copyright_author: Jack Zhu
15+
copyright_author_href:
16+
copyright_url: http://jackzhu.top/
17+
copyright_info:
18+
mathjax:
19+
katex:
20+
aplayer:
21+
highlight_shrink:
22+
aside:
23+
---
24+
25+
在 Python 开发中,使用好的包和项目管理工具,相当于打好基础,相关件将相宜実。这年头,来自 Astral (即 Ruff 和 Black 的开发者) 的新工具「UV」,一上线就引发了广泛关注,以 Rust 高性能实现,目标是替代 pip,virtualenv,poetry 等组合,成为 Python 最新一代的包管理栏杆。
26+
27+
## 为什么要使用uv
28+
29+
现在的包管理工具有很多,conda,pip,poetry,pipenv 等等,功能各有千秋,但都存在一些问题,而uv则可以在很大程度上解决了这些问题。
30+
31+
自从接触到uv之后我几乎不再使用其他包管理工具,只有部分情况是例外的,比如个别仓库默认的包管理工具是conda或者poetry,而且这个项目用uv会存在bug,比如ComfyUI,使用uv就会有问题,这种就会使用conda。或者个别比较老的代码,有些时候就存在一些问题,这种还是求稳定最好。
32+
33+
### uv的优势
34+
35+
1. 极致性能
36+
37+
- 安装速度提升:这是非常重要的一点,UV 在无缓存的冷启动情况下,安装速度比 pip 快约 8~10 倍;uv在已有缓存的情况下,速度提升可达 80~100 倍。这一点看似不明显,但是亲身体验之后就回不去了,命令刚输完就执行完了,简直不要太爽。pip是单线程串行下载,且每安装一个包就校验一次,速度受限;解析依赖时是**递归深度优先**,每次都重新 resolve,IO+CPU双重瓶颈。而uv**完全异步并行下载**(利用 Rust 的 tokio runtime),同时批量多线程拉取 wheel 文件。**依赖解析一次性建树**,在内存中直接解析出完整依赖树,再按优先级并行处理。大量减少 I/O 阻塞、减少不必要校验轮次。
38+
39+
40+
- 并行下载与解析:​利用 Rust 的并发能力,UV 实现了高效的依赖解析和并行下载,大幅减少了安装时间。uv在解析阶段同时并发处理**多条依赖关系。下载阶段是异步 HTTP 客户端**,同时并发多达 32+ 连接从镜像源拉取 `.whl` 文件。在安装阶段:**解压 wheel 包时并行 IO + CPU 分摊**。最近几年很多rust的项目都表现不错,未来可期。
41+
42+
43+
- 全局缓存机制:UV 使用全局包缓存,避免重复下载和构建,提高了资源利用率。这一点其实还是很重要的,因为conda也可以进行全局缓存,但是conda由于本身就非常慢,这样效率其实也没有快哪里去。同时uv的依赖解析缓存也更加细粒度,非常快,全局统一缓存目录管理更加智能,冷启动性能好。**pip 的 cache**只是简单放 `.whl` 文件。**UV的 cache**更加复杂,针对不同源(PyPI、国内镜像等)**独立管理缓存目录**;wheel/binary/source包缓存分离;pip-style `.whl` 缓存 + 自有 `build cache`(本地打包 artifacts);还有**软链接/硬链接优化**(安装时尽量链接,不拷贝)
44+
45+
2. 统一的项目管理
46+
47+
- 集成虚拟环境管理:​UV 内置虚拟环境管理功能,自动在项目中创建和管理虚拟环境,避免了手动操作,非常方便,而且还方便切换python多个版本,避免了本地环境污染。
48+
49+
- 支持 pyproject.toml:UV 使用 pyproject.toml 作为项目配置文件,统一管理依赖和项目元数据。这是一种现代化的依赖管理方法,负责定义项目的元数据、依赖关系、构建系统以及 UV 的特定配置。
50+
51+
- 生成锁定文件:​UV 自动生成 uv.lock 文件,精确记录每个包的版本和校验信息,确保环境的可重复性。​
52+
53+
3. 灵活的依赖解析
54+
55+
- 多种解析策略:​UV 提供多种依赖解析策略,如选择最新兼容版本或最低版本组合,满足不同需求。​
56+
57+
- 支持多 Python 版本:​UV 允许指定目标 Python 版本进行依赖解析,即使当前环境中未安装该版本的 Python。​
58+
59+
60+
依赖覆盖机制:​UV 引入了“依赖覆盖”机制,允许用户修改某些包声明的依赖版本,解决上游包的依赖冲突问题。​
61+
62+
4. 丰富的功能集
63+
命令行工具管理:​UV 提供类似于 pipx 的功能,可以在隔离的环境中安装 Python 工具,同时使它们的命令行接口全局可用。​
64+
65+
Python 版本管理:​UV 支持安装和管理不同版本的 Python,方便在项目中使用特定版本的解释器。​
66+
67+
脚本运行支持:​UV 支持运行脚本,并支持内联的依赖元数据,简化了脚本的依赖管理。
68+
69+
## 基本使用和常用命令
70+
71+
一段很简单的安装:
72+
73+
pip install uv
74+
75+
快速创建项目:
76+
77+
uv init my_project
78+
cd my_project
79+
80+
添加包:
81+
82+
uv add requests
83+
84+
删除包:
85+
86+
uv remove requests
87+
88+
同步安装依赖:
89+
90+
uv sync
91+
92+
重新解析依赖并生成锁定文件:
93+
94+
uv lock
95+
96+
创建虚拟环境:
97+
98+
uv venv .venv
99+
100+
跟 pip 使用方式类似:
101+
102+
uv pip install flask
103+
104+
运行脚本:
105+
106+
uv run python app.py
107+
108+
清理缓存:
109+
110+
uv cache clean
111+
112+
pyproject.toml 包管理文件使用
113+
114+
UV 采用标准的 pyproject.toml,统一管理项目信息和依赖:
115+
116+
基础结构:
117+
118+
[project]
119+
name = "my_project"
120+
version = "0.1.0"
121+
dependencies = [
122+
"requests>=2.31",
123+
"numpy~=1.24"
124+
]
125+
126+
[project.optional-dependencies]
127+
dev = ["pytest", "black"]
128+
129+
[build-system]
130+
requires = ["hatchling"]
131+
build-backend = "hatchling.build"
132+
133+
UV 特有配置:
134+
135+
[tool.uv]
136+
managed = true
137+
package = true
138+
139+
[[tool.uv.index]]
140+
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
141+
default = true
142+
143+
[tool.uv] 表示是否由 UV 管理虚拟环境、打包等
144+
145+
index 可以指定镜像源(如清华 PyPI)
146+
147+
同时 UV 会生成 uv.lock,锁定给定环境下的确定包版本和校验信息,保证可重复性。
148+
149+
常见问题和解决方法
150+
151+
1. 使用 --system-site-packages 后包无效
152+
153+
UV 创建虚拟环境时,当使用 --system-site-packages,运行可以访问系统包,但不会在解析时考虑。
154+
155+
建议自己在虚拟环境内重新安装所需包,保证环境简洁可控。
156+
157+
2. 删除包后剩余依赖
158+
159+
uv remove xxx 不会自动删除其下气包
160+
161+
请手动执行:
162+
163+
uv lock
164+
uv sync
165+
166+
依赖分析后自动清理
167+
168+
3. 网络慢,下载失败
169+
170+
使用国内镜像:
171+
172+
uv config set index-url https://pypi.tuna.tsinghua.edu.cn/simple
173+
174+
4. uv.lock 未自动更新
175+
176+
进行依赖改动后,需自动执行:
177+
178+
uv lock
179+
180+
在 UV 中管理 PyTorch
181+
182+
1. 基础安装:
183+
184+
默认:Windows/Mac 安装 CPU-only 版,Linux 安装 CUDA 12.4 版
185+
186+
uv init --python 3.12
187+
uv add torch torchvision torchaudio
188+
189+
2. 安装指定 CUDA 版(如 12.6):
190+
191+
修改 pyproject.toml:
192+
193+
[[tool.uv.index]]
194+
name = "pytorch-cu126"
195+
url = "https://download.pytorch.org/whl/cu126"
196+
explicit = true
197+
198+
[tool.uv.sources]
199+
torch = { index = "pytorch-cu126" }
200+
torchvision = { index = "pytorch-cu126" }
201+
torchaudio = { index = "pytorch-cu126" }
202+
203+
后执行:
204+
205+
uv sync
206+
207+
3. 验证 CUDA 支持
208+
209+
新建脚本:
210+
211+
import torch
212+
print(torch.cuda.is_available())
213+
print(torch.cuda.get_device_name(0))
214+
215+
运行:
216+
217+
uv run python check_cuda.py
218+
219+
常见问题:
220+
221+
如果直接用 uv pip install 安装,pyproject.toml 不会更新,建议终究使用 uv add
222+
223+
如遇到网络慢,同样可配置用国内镜像源
224+
225+
总结
226+
227+
UV 是一款超高性能、全配套、很合于环境及大型项目管理的新世代工具,特别适合对环境素质有严格要求的开发者和研究人员。
228+
229+
无论是日常开发,进行快速指定版本部署,还是复杂的模型训练,UV 都完全能上场,是很值得推荐的 Python 包管理方案。

source/about/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ comments: false
77

88
# 个人介绍
99

10-
本人是西安电子科技大学18级本科生,22级西电研三,主要学习AI相关的内容,做过的方向有视频理解,时序定位,分割,检测,姿态估计,医学影像配准,多模态胶质瘤分割分级相关领域,现在也在做AIGC图文生成、大语言模型相关的内容,之后本来打算做大模型算法研发的,现在改去某大厂做做语音算法了
10+
本人是西安电子科技大学18级本科生,22级西电研三,主要学习AI相关的内容,做过的方向有视频理解,时序定位,分割,检测,姿态估计,医学影像配准,多模态胶质瘤分割分级相关领域,现在也在做AIGC图文生成、大语言模型相关的内容,之后本来打算做大模型算法研发的,后改去某大厂做做语音算法,现在又在做大模型Agent了
1111

1212
平时比较懒,但也想折腾点有意思的东西,博客大部分时间闲置,有时间了就学点技术做点分享好了,顺便发点论文阅读的内容,虽然目前看来并没有什么时间,也没什么人看。
1313

0 commit comments

Comments
 (0)