Всем привет! Недавно познакомился с замечательным пакетным менеджером UV. Хочу и Вас с ним познакомить!
Hidden text
На Хабре статей не нашел. В русском сегменте youtube так же ничего нет. Если это не так — сорян)
Что такое UV?
UV (сайт) — это чрезвычайно быстрый пакетный менеджер Python, написанный на Rust. Разработан как замена для pip и pip-tools. Помимо этого он может собой заменить venv и pyenv. Но обо всем по порядку.
Бенчмарки от разработчиков - это хорошо, но я решил сам проверить насколько он хорош. Замеры весьма условные и синтетические. Сделаны больше для сопоставления нежели для реального сравнения. Время в секундах.
Команда |
pip |
uv |
|
Создание окружения |
real |
3,468 |
0,028 |
user |
3,468 |
0,000 |
|
Установка flask |
real |
19,166 |
0,024 |
user |
2,465 |
0,019 |
|
Установка requests(для сравнения) |
real |
37,865 |
1,055 |
user |
1,820 |
0,096 |
Результаты весьма достойные!
Установка UV
On macOS and Linux.
curl -LsSf https://astral.sh/uv/install.sh | sh
On Windows.
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
For a specific version.
curl -LsSf https://astral.sh/uv/0.2.23/install.sh | sh
powershell -c "irm https://astral.sh/uv/0.2.23/install.ps1 | iex"
With pip.
pip install uv
With pipx.
pipx install uv
With Homebrew.
brew install uv
Создание окружения
uv venv
Активация окружения
On macOS and Linux.
source .venv/bin/activate
On Windows.
.venv\Scripts\activate
Установка библиотек
uv pip install flask # Ставим flask
uv pip install -r requirements.txt # Установка из requirements.txt
Фиксация зависимостей
uv pip freeze | uv pip compile - -o requirements.txt
Что еще умеет UV?
Первое — это работа с виртуальным окружением(как создать окружение показал выше).
Второе, но не по значению — это управления версиями Python. Есть проект pyenv и думаю тут UV сможет его потеснить. Если кратко, то pyenv — это система управления версиями Python на вашем компьютере. Скажем, стоит у Вас Python 3.10, а Вы хотите поставить 3.8. У Вас два варианта — или скачать с официального сайта и скомпилировать, или поставить pyenv и уже с его помощью поставить интерпретатор нужной версии и создавать от него окружения.
А тут все в одном инструменте!
1) Ставим нужную версию Python
uv python install 3.12
2) Проверяем что все установилось
uv python list
3) Создаем окружение с новой версией
uv venv -p /home/timur/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/bin/python3 venv2
source venv2/bin/activate
Вуаля! Теперь у нас новый Python и новое окружение к нему.
Помимо этого можно ставить утилиты через uv tool, но я, если честно, не особо этим пользовался.
Так же есть возможность управлять кэшем пакетов через uv cache.
Как итог
Плюсы:
Самый огромный плюс — это скорость.
Синтаксис. Если умеете работать с pip, то большинство команд будут вам знакомы.
Работа с виртуальным окружением — пушка!
Работа с версиями Python — просто бомба!
Платформозависимые lockfile.
Нет фиксации контрольной суммы зависимой библиотеки как в том же poetry.
Пока не получится посмотреть дерево зависимостей как в poetry.
UV — это интересный пакетный менеджер. Он очень быстрый и понятный в силу своей похожести на pip. Управление виртуальным окружением и управление версиями Python делают UV инструментом 3 в 1, что только добавляет ему привлекательности. Думаю, он уже сейчас может конкурировать с poetry и другими крупными пакетными менеджерами.
Комментарии (24)
gerod
10.07.2024 18:06+2Вообще интересно знать почему такая существенна разница во времени?
RH215
10.07.2024 18:06+1Разрешение зависимостей - вычислительно сложная задача. Python упирается в свою же производительность.
Dominux
10.07.2024 18:06Думал он, например, на си, но оказалось действительно на питоне. Казалось бы, могли бы сразу на си реализовать, но мы имеем то, что имеем
RH215
10.07.2024 18:06+1В те времена никого не волновала скорость работы пакетного менеджера, в разумных пределах. Это стало важно когда пошли CI с их постоянными пересборками.
RH215
10.07.2024 18:06Выглядит как заявка на то, чтобы сделать всё остальное устаревшим. В экосистеме Python как раз не хватало консистентности.
morijndael
10.07.2024 18:06Тут до сих пор не могут от setup.py избавиться, в итоге просто резолвинг зависимостей в общем случае требует выполнять произвольные скрипты, которые могут ещё и не запуститься. А чтобы заменить всё на один пакетный менеджер и систему сборки...ну, мечтать конечно приятно и не вредно...
yokotoka
10.07.2024 18:06+1Дополню что есть ещё rye от Армина Ронахера (создатель Flask и Sentry), оно под капотом использует этот uv или pip-tools, приятный инструмент для менеджмента питонячьего зоопарка
jimquery
10.07.2024 18:06Не иронично ли, что создатель Flask использовал Django для Sentry? Интересный парень, этот Армин.
pesh1983
10.07.2024 18:06+1Очень часто большую часть времени в установке зависимостей занимает сборка какого-нибудь пакета из исходников, потому что нет готового бинарника под нужную архитектуру. А ту скорость, про которую написано в статье, вы будете ощущать только при установке окружения начисто с нуля, что происходит... ну пару раз за несколько месяцев? может... Так что самый большой плюс получают наверное те, кто постоянно устанавливает что-то и желательно с нуля.
Зато есть жирный минус, перекрывающий сомнительный "самый огромный" плюс - Платформозависимые lockfile. То есть, я либо использую для разработки и деплоя одну платформу, либо виртуализация, эмуляция и и иже с ними. Хотя даже питон сам по себе платформонезависимый, и собрать можно практически под любую архитектуру, и разрабатывать и запускатьь код в большинстве случаев без шаманства на разных архитектурах.
Так что я прям даже не знаю, я лучше заюзаю pdm или poetry. Не так быстро ставят, зато экономят время на разработку в целом без пляски с архитектурами.
UsmanovTim Автор
10.07.2024 18:06Соглашусь, если вы используете poetry, то стоит взвесить все за и против. Но если например проект только начался или уже используется pip, то можно смело рассматривать вариант UV. Переход будет несложным, а удобство прибавится в проекте.
Ryav
10.07.2024 18:063) Создаем окружение с новой версией
uv venv -p /home/timur/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/bin/python3 venv2
Не очень-то удобно выглядит. В том же pdm это делается через `pdm venv create 3.12`, ну или через `pdm init` и дальнейшем выбором версии.
С
pyproject.toml
никак не взаимодействует? Например, те же зависимости и настройка? Имеется ли возможность указать ему на файл.env
, чтобы в виртуальное окружение подтянулось?UsmanovTim Автор
10.07.2024 18:06В примере я указал путь до скачанного интерпретатора. Но если у Вас уже стоит Python нужной версии, то можно указать и uv venv -p python3.12 venv.
nightblure
10.07.2024 18:06+3Спасибо за обзор!
Кажется, что не упомянуты следующие важные вещи: автор Hatch пишет "UV is under active development and may not work for all dependencies". Источник: https://hatch.pypa.io/latest/how-to/environment/select-installer/#enabling-uv
Также в репозитории uv в ридми авторы пишут следующее: "uv does not yet have a stable API; once uv's API is stable (v1.0.0), the versioning scheme will adhere to Semantic Versioning". Источник: https://github.com/astral-sh/uv.
Инструмент видимо находится в активной и экспериментальной фазе разработки (кажется, поэтому в Hatch предусмотрена возможность отключения uv), но выглядит интересно и многообещающе)
UsmanovTim Автор
10.07.2024 18:06Спасибо! Да, инструмент в разработке и многое обещают позже подвезти. Но даже в таком виде можно использовать на малых проектах)
Andrey_Solomatin
10.07.2024 18:06+1В нет есть фича которая хорошо ускоряет установку больших пакетов, если вы не используете полный lock всех зависимостей.
However, uv's resolution strategy can be configured to support alternative workflows. With --resolution=lowest, uv will install the lowest compatible versions for all dependencies, both direct and transitive.
Наприерм зависимость написанна other-lib>=1.5
Частая проблема пипа, это то, что скачивается последняя версия (например 3.14), и она не подходит по зависимостям. Тогда скачивается версия постарше. И так может продолжаться долго, до 90% всего времени устрановки.
С этой опцией всё начинается снизу, со самой старой версии (1.5). То есть если она сработала сегодня, то сработает и завтра и без лишних скачиваний.
Octabun
Пушка и бомба? Создание окружения быстрее - замечательно, но оно создаётся не каждый месяц. Что такое работа с версиями - не проникся, активируешь окружение нужного Питона, а его всё равно нужно активировать, и всё. И ради этого допускать в свою жизнь ещё одну сущность?
Нет, это хорошо для Rust и даже может быть кому-то полезно, но те же bat или nnn, тоже плоды движения ржавых переписчиков, играют на две лиги выше.
UsmanovTim Автор
Спасибо за вопросы!
Данный проект интересен своей разнонаправленностью. По сути в нем 3 инструмента. Менеджер пакетов, менеджер окружения и версий интерпретаторов. Как минимум тут убираются 2 сущности venv и pyenv.
Согласен, окружение и Python мы не ставим каждый день, но разница в скорости загрузки библиотек значительная и это можно применить в тех же пайплайнах в CI.
Возможно есть подобные проекты еще. Если подскажите какие буду только благодарен) Про nnn спасибо! Посмотрю)
Целью данной статьи был обзор конкретно данного решения. И я выделил те плюсы и минусы, которые есть у данного решения.
Про работу с версиями я имел ввиду установку нескольких версий интерпретаторов в систему. pyenv и аналогичные решения позволяют мягко установить разные версии без повреждения зависимостей в основной системе.
baldr
Ну, кстати говоря, это на своём ноутбуке вы не каждый месяц создаёте.
А представьте себе билд-сервер, который, например, строит десятки Docker-образов приложений каждый день. Даже на 10 секунд быстрее - это меньше ресурсов сервера, которые могут достаться другой задаче.
kosdmit
Еще, как пример, ограничение на процессорное время сервера в github Actions - 2000 мин в месяц (тариф github Free), которое по большей части тратится на сборку окружений для запуска тестов. Используя более быстрые пакетные менеджеры/инструменты виртуализации можно кратно увеличить количество запускаемых тестов, не привысив установленные лимиты.
dimension888
И все десятки приложений на питоне и у всех десятков приложений разные версии библиотек и разные окружения, и ни один образ нельзя создать на основе другого? И на этом гипотетическом сервере ещё не реализовали ни один альтернативный метод оптимизации, всё тупо через pip из интернета качается? Тогда да, будет полезно, особенно если ошибка в работе с новым инструментом с которой придётся несколько часов разбираться не аннулирует выигрыш из-за ускорения за несколько месяцев.
baldr
Когда вам доведется поработать в достаточно крупной компании - вы перестанете смеяться в цирке и задавать такие вопросы.
Небольшой коллектив из 600 человек может разрабатывать 300+ различных сервисов для одного продукта, причём, да, разных версий, втч экспериментальных. Одни сервисы могут требовать определённые версии других, втч и старых. Билд-сервер загружен постоянно и не уверен что он был один.
Не очень большая часть из этого была на питоне, но, тем не менее, ситуация более чем реальна. Конечно, одной заменой менеджера пакетов проблемы не решаются, но это один из шагов.
Хорошо, что экосистема развивается и появляются новые инструменты.
Ryav
Так nnn же на C.