Всем привет! Недавно познакомился с замечательным пакетным менеджером 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)


  1. Octabun
    10.07.2024 18:06

    Пушка и бомба? Создание окружения быстрее - замечательно, но оно создаётся не каждый месяц. Что такое работа с версиями - не проникся, активируешь окружение нужного Питона, а его всё равно нужно активировать, и всё. И ради этого допускать в свою жизнь ещё одну сущность?

    Нет, это хорошо для Rust и даже может быть кому-то полезно, но те же bat или nnn, тоже плоды движения ржавых переписчиков, играют на две лиги выше.


    1. UsmanovTim Автор
      10.07.2024 18:06
      +3

      Спасибо за вопросы!
      Данный проект интересен своей разнонаправленностью. По сути в нем 3 инструмента. Менеджер пакетов, менеджер окружения и версий интерпретаторов. Как минимум тут убираются 2 сущности venv и pyenv.
      Согласен, окружение и Python мы не ставим каждый день, но разница в скорости загрузки библиотек значительная и это можно применить в тех же пайплайнах в CI.
      Возможно есть подобные проекты еще. Если подскажите какие буду только благодарен) Про nnn спасибо! Посмотрю)
      Целью данной статьи был обзор конкретно данного решения. И я выделил те плюсы и минусы, которые есть у данного решения.
      Про работу с версиями я имел ввиду установку нескольких версий интерпретаторов в систему. pyenv и аналогичные решения позволяют мягко установить разные версии без повреждения зависимостей в основной системе.


    1. baldr
      10.07.2024 18:06
      +5

      Пушка и бомба? Создание окружения быстрее - замечательно, но оно создаётся не каждый месяц. Что такое работа с версиями - не проникся, активируешь окружение нужного Питона, а его всё равно нужно активировать, и всё. И ради этого допускать в свою жизнь ещё одну сущность?

      Ну, кстати говоря, это на своём ноутбуке вы не каждый месяц создаёте.

      А представьте себе билд-сервер, который, например, строит десятки Docker-образов приложений каждый день. Даже на 10 секунд быстрее - это меньше ресурсов сервера, которые могут достаться другой задаче.


      1. kosdmit
        10.07.2024 18:06
        +5

        Еще, как пример, ограничение на процессорное время сервера в github Actions - 2000 мин в месяц (тариф github Free), которое по большей части тратится на сборку окружений для запуска тестов. Используя более быстрые пакетные менеджеры/инструменты виртуализации можно кратно увеличить количество запускаемых тестов, не привысив установленные лимиты.


      1. dimension888
        10.07.2024 18:06

        И все десятки приложений на питоне и у всех десятков приложений разные версии библиотек и разные окружения, и ни один образ нельзя создать на основе другого? И на этом гипотетическом сервере ещё не реализовали ни один альтернативный метод оптимизации, всё тупо через pip из интернета качается? Тогда да, будет полезно, особенно если ошибка в работе с новым инструментом с которой придётся несколько часов разбираться не аннулирует выигрыш из-за ускорения за несколько месяцев.


        1. baldr
          10.07.2024 18:06
          +1

          Когда вам доведется поработать в достаточно крупной компании - вы перестанете смеяться в цирке и задавать такие вопросы.

          Небольшой коллектив из 600 человек может разрабатывать 300+ различных сервисов для одного продукта, причём, да, разных версий, втч экспериментальных. Одни сервисы могут требовать определённые версии других, втч и старых. Билд-сервер загружен постоянно и не уверен что он был один.

          Не очень большая часть из этого была на питоне, но, тем не менее, ситуация более чем реальна. Конечно, одной заменой менеджера пакетов проблемы не решаются, но это один из шагов.

          Хорошо, что экосистема развивается и появляются новые инструменты.


    1. Ryav
      10.07.2024 18:06

      Так nnn же на C.


  1. gerod
    10.07.2024 18:06
    +2

    Вообще интересно знать почему такая существенна разница во времени?


    1. kt97679
      10.07.2024 18:06

      И как это связано с использованием раста.


    1. RH215
      10.07.2024 18:06
      +1

      Разрешение зависимостей - вычислительно сложная задача. Python упирается в свою же производительность.


      1. Dominux
        10.07.2024 18:06

        Думал он, например, на си, но оказалось действительно на питоне. Казалось бы, могли бы сразу на си реализовать, но мы имеем то, что имеем


        1. RH215
          10.07.2024 18:06
          +1

          В те времена никого не волновала скорость работы пакетного менеджера, в разумных пределах. Это стало важно когда пошли CI с их постоянными пересборками.


  1. RH215
    10.07.2024 18:06

    Выглядит как заявка на то, чтобы сделать всё остальное устаревшим. В экосистеме Python как раз не хватало консистентности.


    1. morijndael
      10.07.2024 18:06

      Тут до сих пор не могут от setup.py избавиться, в итоге просто резолвинг зависимостей в общем случае требует выполнять произвольные скрипты, которые могут ещё и не запуститься. А чтобы заменить всё на один пакетный менеджер и систему сборки...ну, мечтать конечно приятно и не вредно...


  1. yokotoka
    10.07.2024 18:06
    +1

    Дополню что есть ещё rye от Армина Ронахера (создатель Flask и Sentry), оно под капотом использует этот uv или pip-tools, приятный инструмент для менеджмента питонячьего зоопарка


    1. jimquery
      10.07.2024 18:06

      Не иронично ли, что создатель Flask использовал Django для Sentry? Интересный парень, этот Армин.


  1. pesh1983
    10.07.2024 18:06
    +1

    Очень часто большую часть времени в установке зависимостей занимает сборка какого-нибудь пакета из исходников, потому что нет готового бинарника под нужную архитектуру. А ту скорость, про которую написано в статье, вы будете ощущать только при установке окружения начисто с нуля, что происходит... ну пару раз за несколько месяцев? может... Так что самый большой плюс получают наверное те, кто постоянно устанавливает что-то и желательно с нуля.

    Зато есть жирный минус, перекрывающий сомнительный "самый огромный" плюс - Платформозависимые lockfile. То есть, я либо использую для разработки и деплоя одну платформу, либо виртуализация, эмуляция и и иже с ними. Хотя даже питон сам по себе платформонезависимый, и собрать можно практически под любую архитектуру, и разрабатывать и запускатьь код в большинстве случаев без шаманства на разных архитектурах.

    Так что я прям даже не знаю, я лучше заюзаю pdm или poetry. Не так быстро ставят, зато экономят время на разработку в целом без пляски с архитектурами.


    1. UsmanovTim Автор
      10.07.2024 18:06

      Соглашусь, если вы используете poetry, то стоит взвесить все за и против. Но если например проект только начался или уже используется pip, то можно смело рассматривать вариант UV. Переход будет несложным, а удобство прибавится в проекте.


      1. pesh1983
        10.07.2024 18:06

        Дак вот по удобству как раз большие вопросы, и я написал почему.


  1. Ryav
    10.07.2024 18:06

    3) Создаем окружение с новой версией

    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 , чтобы в виртуальное окружение подтянулось?


    1. UsmanovTim Автор
      10.07.2024 18:06

      В примере я указал путь до скачанного интерпретатора. Но если у Вас уже стоит Python нужной версии, то можно указать и uv venv -p python3.12 venv.


  1. 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), но выглядит интересно и многообещающе)


    1. UsmanovTim Автор
      10.07.2024 18:06

      Спасибо! Да, инструмент в разработке и многое обещают позже подвезти. Но даже в таком виде можно использовать на малых проектах)


  1. 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). То есть если она сработала сегодня, то сработает и завтра и без лишних скачиваний.