Привет! С вами Леша Жиряков, техлид backend-команды витрины онлайн-кинотеатра KION и по совместительству пропагандист Python: в МТС я возглавляю Python-гильдию. Но как бы много я ни говорил про преимущества этого ЯП, многие стандартные инструменты экосистемы ограничены. Тот же pip не всегда эффективно разрешает конфликты зависимостей, например при сложных иерархиях пакетов. Это сказывается на производительности команд разработчиков, особенно когда проекты растут и кодовая база увеличивается.
И тут мы наблюдаем интересную тенденцию. Появляются инструменты нового поколения, написанные на Rust, которые значительно расширяют возможности Python-разработчиков. С одной стороны, они сохраняют привычный рабочий процесс, с другой — ускоряют выполнение стандартных задач в несколько раз.
Сегодня хочу обсудить два таких инструмента — Ruff и uv. Давайте посмотрим, как эти технологии могут трансформировать повседневный рабочий процесс и сэкономить нам время. Погнали!

Ruff — новый стандарт линтинга для Python-разработчиков
Линтер Ruff набирает популярность благодаря беспрецедентной скорости и гибкости. Он написан на Rust и объединяет функциональность множества популярных инструментов вроде Flake8, isort и pyupgrade в единый высокопроизводительный пакет.
Ruff умеет не только находить проблемы в коде, но и автоматически исправлять многие из них. Лично нам в Kion переход на Ruff дал сильнейший прирост в скорости, мы перестали терять время на линтинге. Раньше процесс был настолько долгий, что можно было пойти заварить себе чай много чая, но теперь все происходит мгновенно.
Немного статистики:
Количество звезд на GitHub: 38.3k.
Количество открытых Issues: 1.4k.
Дата последнего релиза: 01.05.2025.
Дата последнего коммита: каждый день. В среднем 80 коммитов в неделю.
Номер последней версии: 0.11.8.
В каких известных проектах используется Ruff:
Преимущества Ruff
Скорость работы
Производительность — главное преимущество Ruff. Благодаря реализации на Rust он работает на порядок быстрее традиционных инструментов.
А вот и пример сравнения времени проверки проекта среднего размера:
# Проверка проекта с использованием Flake8
$ time flake8 my_project/
real 0m3.254s
# Проверка того же проекта с использованием Ruff
$ time ruff check my_project/
real 0m0.142s
То есть Ruff выполняет ту же работу в 23 раза быстрее. На больших проектах разница может быть еще более впечатляющей.
Множество проверок «из коробки»
Ruff поддерживает больше 700 правил, охватывающих разные аспекты качества кода:
# Пример кода с несколькими проблемами
def calculate_total(items_list):
total = 0
for i in range(len(items_list)):
total = total + items_list[i]
return total
unused_var = 100
Выполнив ruff check, мы получим:
example.py:2:5: F841 Local variable 'unused_var' is assigned to but never used
example.py:4:5: C416 Unnecessary `list` index lookup; use `for item in items_list` instead
example.py:5:12: E501 Use `total += items_list[i]` instead of `total = total + items_list[i]`
Автоматическое исправление
Ruff может автоматически исправлять многие проблемы с помощью команды ruff check --fix:
# После автоматического исправления
def calculate_total(items_list):
total = 0
for item in items_list:
total += item
return total
Так можно исправить некорректное форматирование кода (отступы, пробелы, переносы строк), удалить неиспользуемые импорты, переупорядочить импорты по стандартам PEP8, исправить синтаксис f-строк, пофиксить избыточный код и так далее.
Ruff поддерживает более 700 правил с возможностью автоматического исправления многих из них.
Сортировка импортов
Ruff включает функциональность, аналогичную isort, для сортировки импортов
# До сортировки
import sys
import os
from collections import defaultdict
import requests
from typing import List, Dict
# После `ruff check --fix`
import os
import sys
from collections import defaultdict
from typing import Dict, List
import requests
Форматирование кода
Новейшие версии Ruff добавляют форматирование кода, заменяя black:
$ ruff format my_project/
Formatted 42 files in 0.3s
Сравните с black:
$ time black my_project/
Formatted 42 files in 2.47s
Снова видим значительный выигрыш в скорости: в 10+ раз быстрее!
Интеграция с инструментами
Ruff легко интегрируется с популярными редакторами и CI/CD-системами:
# pyproject.toml
[tool.ruff]
# Правила, которые будут применяться
select = ["E", "F", "I", "N", "UP", "B", "A"]
# Игнорируемые правила
ignore = ["E501"]
# Версия Python для проверки совместимости
target-version = "py310"
# Автоматическое исправление
fixable = ["ALL"]
# Сортировка импортов
src = ["src", "tests"]
[tool.ruff.isort]
known-first-party = ["my_package"]
Переход с других инструментов
Ruff значительно упрощает переход с других инструментов через специальную команду:
$ ruff check --select=ALL --statistics
Found 127 errors (100 fixable).
F401: 45 errors
E501: 32 errors
...
Это помогает определить, какие правила следует включить в проект.
Подытожим преимущества Ruff:
высокая скорость работы: в 10–100 раз быстрее традиционных инструментов;
объединение функциональности множества отдельных инструментов: Flake8, isort, pyupgrade, yesqa и так далее;
большой набор правил и проверок;
мощные возможности автоматического исправления;
гибкая настройка под нужды проекта.

Если вы заботитесь о качестве своего Python-кода и цените свое время, Ruff должен стать частью вашего инструментария. В моей практике переход на Ruff значительно ускорил процессы CI/CD и повысил удовлетворенность команды от работы с кодовой базой.
Python uv: революция в управлении пакетами Python
Современная разработка на Python невозможна без использования внешних библиотек, вот только ограничения стандартного менеджера пакетов pip могут замедлять рабочий процесс. Python uv решает эти проблемы и делает работу с зависимостями быстрее и надежнее. Как уже говорил выше, этот новый высокопроизводительный менеджер пакетов тоже написан на Rust.
Немного статистики:
Количество звезд на GitHub: 52.3k.
Количество открытых Issues: 1.6k.
Дата последнего релиза: 30.04.2025.
Дата последнего коммита: каждый день. В среднем 45 коммитов в неделю.
Номер последней версии: 0.7.2.
Преимущества uv
Скорость установки
Благодаря параллельной установке и оптимизированному коду на Rust uv устанавливает пакеты в несколько раз быстрее pip.
В этом примере uv установил Django в пять раз быстрее:
# Сравнение времени установки Django с зависимостями
$ time pip install django
real 0m9.342s
user 0m8.121s
sys 0m1.223s
$ time uv pip install django
real 0m1.873s
user 0m1.214s
sys 0m0.659s
Умное управление виртуальными окружениями
У uv встроенная поддержка виртуальных окружений, что упрощает их создание и управление:
# Создание виртуального окружения и установка пакетов одной командой
$ uv venv .venv && uv pip install -r requirements.txt --venv .venv
Совершенная воспроизводимость окружений
uv гарантирует, что ваше приложение будет работать одинаково на всех машинах:
# requirements.lock.txt, созданный с помощью uv
django==4.2.7
asgiref==3.7.2
sqlparse==0.4.4
pytest==7.4.3
exceptiongroup==1.1.3
iniconfig==2.0.0
packaging==23.2
pluggy==1.3.0
Интеллектуальное разрешение конфликтов зависимостей
uv использует более совершенный алгоритм для разрешения зависимостей, который минимизирует конфликты:
# Разрешение конфликта зависимостей с помощью pip
$ time pip install package-a package-b
ERROR: Cannot install package-a and package-b because these packages have conflicting dependencies.
# Разрешение того же конфликта с помощью uv
$ time uv pip install package-a package-b
Successfully installed package-a-1.0.0 package-b-2.0.0 dependency-c-3.1.2
Мгновенный поиск пакетов
uv значительно ускоряет поиск пакетов благодаря локальному кэшированию:
# Поиск с помощью pip
$ time pip search numpy
WARNING: pip search is disabled...use https://pypi.org/search instead
# Поиск с помощью uv
$ time uv pip search numpy
numpy (1.26.3) - Fundamental package for array computing in Python
numpy-financial (1.0.0) - Financial functions for NumPy
...
real 0m0.212s
Интеграция с современными инструментами
uv прекрасно работает с pyproject.toml и другими современными инструментами Python — Poetry, Ruff и так далее:
# Установка проекта в режиме разработки с учетом опциональных зависимостей
$ uv pip install -e ".[dev,test]"
Производительность в реальных сценариях
Посмотрите на проект со множеством зависимостей:
# Установка зависимостей для проекта машинного обучения
$ time pip install tensorflow pandas scikit-learn matplotlib seaborn jupyter
real 2m14.724s
$ time uv pip install tensorflow pandas scikit-learn matplotlib seaborn jupyter
real 0m42.183s
Получается, установка сложного набора пакетов ускорилась более чем в три раза.
Подытожу. Разработчики любят Python uv за высокую скорость, надежное разрешение зависимостей и современный подход к управлению пакетами. Если в приоритете время и надежность проектов, переход на uv — обоснованное решение, оно окупится уже на первом крупном проекте.

Что в итоге
На примере двух инструментов, о которых я сегодня писал, можно отследить новый тренд — использование производительных технологий на базе Rust для преодоления традиционных ограничений языка Python. Ruff и uv позволяют разработчикам сохранить все преимущества Python и при этом устранить присущие его экосистеме узкие места: долгий линтинг, проблемы с решением сложных зависимостей и безопасностью.
Ценно, что оба инструмента совместимы с существующими конфигурациями, проектами и рабочими процессами. Чтобы перейти на них, не нужно кардинально перестраивать проект. Когда скорость разработки и качество кода одинаково важны, Ruff и uv дают конкурентное преимущество и позволяют сосредоточиться на бизнес-задачах, а не на рутинных операциях.