Прощай, pip: как uv ускоряет Python-проекты в десятки раз
Я долго считал, что медленный pip install - это неизбежная плата за работу с Python. Мол, так устроена экосистема, и с этим ничего не поделать. Я ошибался.
Каждый день я работаю с Django API, микросервисами и CI/CD-пайплайнами, и управление зависимостями годами оставалось самой болезненной частью процесса. Медленные сборки, сломанные виртуальные окружения, конфликты пакетов, дублирование зависимостей в каждом проекте - всё это съедало время и порождало баги, которые потом приходилось ловить в продакшене.
А потом я попробовал uv. И он изменил мой подход к работе целиком.
Что такое uv
uv - это менеджер пакетов для Python, написанный на Rust. Он заменяет сразу несколько инструментов: pip, venv и частично pyenv. Создан он компанией Astral - той же командой, что стоит за линтером Ruff.
Что он даёт на практике:
- скорость - установка и разрешение зависимостей на порядок быстрее
- надёжность - предсказуемые сборки без «поехавших» окружений
- простоту - один инструмент вместо трёх-четырёх
Почему pip больше не хватает
pip - это установщик пакетов, а не менеджер проектов. У него есть фундаментальные ограничения:
- медленная установка
- неэффективное разрешение зависимостей
- дублирование пакетов в каждом проекте отдельно
- хрупкие окружения, которые легко сломать
Результат - потерянное время и скрытые баги, которые всплывают в самый неподходящий момент.
Установка: Windows, macOS, Linux
Главное преимущество uv в том, что он умеет управлять не только пакетами, но и самим интерпретатором Python.
Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
macOS и Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
Альтернативные способы
winget install --id=astral-sh.uv -e
brew install uv
Проверка через pip
pip install uv
Этот способ рабочий, но ограниченный: он зависит от системного Python и не даёт всех преимуществ нативной установки.
Рабочий процесс: от инициализации до запуска
Инициализация проекта
uv init crypto-tracker
cd crypto-tracker
Установка зависимостей
uv add requests rich
Именно на этом шаге чувствуется разница - установка происходит мгновенно.
Пример кода
import requests
from rich.console import Console
console = Console()
def fetch_price():
data = requests.get(
"https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd"
).json()
price = data["bitcoin"]["usd"]
console.print(f"[bold green]BTC:[/bold green] ${price:,}")
if __name__ == "__main__":
fetch_price()
Запуск
uv run main.py
Никакой активации окружения, никакой дополнительной настройки. Просто запуск.
Выживание в Windows и в корпоративной сети
PowerShell блокирует выполнение скриптов
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Активация venv в Windows
.\.venv\Scripts\activate
Проблемы с SSL в корпоративной сети
$env:UV_NATIVE_TLS="1"
export UV_NATIVE_TLS=1
Настройка прокси
export HTTP_PROXY="http://proxy:8080"
export HTTPS_PROXY="http://proxy:8080"
Winget не распознаётся
Обновите App Installer через Microsoft Store.
Почему uv такой быстрый
Глобальный кэш
Пакеты скачиваются один раз и переиспользуются между всеми проектами. Никакого дублирования.
Движок на Rust
Параллельные загрузки, быстрое распаковывание, нативная производительность без накладных расходов Python.
Алгоритм PubGrub
Быстрое разрешение зависимостей, меньше конфликтов, предсказуемые сборки.
Архитектура проекта после uv init
crypto-tracker/
├── pyproject.toml
├── uv.lock
├── .venv/
└── main.py
pyproject.toml
[project]
name = "crypto-tracker"
version = "0.1.0"
dependencies = ["requests", "rich"]
Заменяет requirements.txt и соответствует официальному стандарту Python.
uv.lock
Фиксирует точные версии всех зависимостей. Обеспечивает воспроизводимость сборок.
.venv
Использует жёсткие ссылки на глобальный кэш. Быстро и легко.
Глобальный кэш
~/.cache/uv/
Жизненный цикл проекта
pyproject.toml ? uv.lock ? .venv ? глобальный кэш
Сравнение: до и после
| pip | uv |
|---|---|
| медленно | сверхбыстро |
| хрупко | надёжно |
| дублирование | глобальный кэш |
| вручную | автоматизировано |
Основные команды
| Команда | Назначение |
|---|---|
uv add |
установка пакетов |
uv run |
выполнение кода |
uv sync |
синхронизация окружения |
uv tree |
отладка зависимостей |
uv python install |
установка Python |
Бенчмарк: pip против uv
Одинаковый набор зависимостей:
requests, numpy, pandas, fastapi
pip
pip install requests numpy pandas fastapi
Время: 15–45 секунд.
uv
uv add requests numpy pandas fastapi
Время: 1–3 секунды.
Результат
| Инструмент | Время |
|---|---|
| pip | 15–45 с |
| uv | 1–3 с |
Ускорение в 10–20 раз.
Пример вывода в терминале
$ uv init crypto-tracker
Initialized project 'crypto-tracker'
$ uv add requests rich
Resolved 12 packages in 120ms
Installed in 340ms
$ uv run main.py
BTC: $67,245
Влияние на CI/CD
До
pip install -r requirements.txt
Время: 60–120 секунд.
После
uv sync
Время: 5–10 секунд.
Что это даёт в реальной работе
После перехода на uv:
- CI-пайплайны ускоряются в разы
- становится меньше багов, связанных с окружением
- упрощается онбординг новых разработчиков
- улучшается общий опыт работы с проектом
Заключение
uv - это не просто очередной инструмент. Это сдвиг в том, как Python-проекты собираются и управляются.
Оставаться на pip сегодня - значит сознательно отставать. Переход на uv - это движение быстрее, чище и разумнее.
Кратко о главном
- заменяет pip и venv
- написан на Rust, поэтому сверхбыстрый
- глобальный кэш устраняет дублирование
- встроенное управление версиями Python
- заметно улучшает опыт разработчика
Попробуйте прямо сейчас:
uv init
Финальная мысль
Когда я впервые увидел, как uv устанавливает проект менее чем за две секунды, я решил, что что-то сломалось.