Как стать автором
Обновить
1760.06
МТС
Про жизнь и развитие в IT

Ускоряем разработку: инструменты экосистемы Python

Время на прочтение6 мин
Количество просмотров4.3K

Привет! С вами Леша Жиряков, техлид 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 и так далее;

  • большой набор правил и проверок;

  • мощные возможности автоматического исправления;

  • гибкая настройка под нужды проекта.

Бенчмарк с GitHub
Бенчмарк с GitHub

Если вы заботитесь о качестве своего 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 — обоснованное решение, оно окупится уже на первом крупном проекте.

Бенчмарк с GitHub
Бенчмарк с GitHub

Что в итоге

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

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

Теги:
Хабы:
+14
Комментарии18

Полезные ссылки

Царица наук приходит в менеджмент: нечеткая математическая логика в принятии управленческих решений

Время на прочтение6 мин
Количество просмотров5.1K
Всего голосов 21: ↑16 и ↓5+17
Комментарии16

Изоляция с помощью глобальных акторов в Swift Concurrency: варианты на примере @MainActor

Время на прочтение7 мин
Количество просмотров312
Всего голосов 6: ↑6 и ↓0+12
Комментарии0

Обходим подводные камни работы с UDA в коде на Lua для ScyllaDB: дружим Java-драйвер и пустые значения

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров581
Всего голосов 6: ↑6 и ↓0+11
Комментарии0

Интеграция виджета обратного звонка МТС Exolve в документацию на MkDocs

Время на прочтение8 мин
Количество просмотров479
Всего голосов 6: ↑6 и ↓0+10
Комментарии0

Путь видео в онлайн-кинотеатрах от «стекла до стекла». Middleware — ядро, подписки, сервисы, витрина

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров910
Всего голосов 4: ↑3 и ↓1+4
Комментарии0

Информация

Сайт
www.mts.ru
Дата регистрации
Дата основания
Численность
свыше 10 000 человек
Местоположение
Россия