Simon Willison→ оригинал

Python 3.15 вышел: ленивые импорты, профайлер Tachyon и JIT на 1,2x быстрее

Вышел Python 3.15. Главное в релизе: явные ленивые импорты (PEP 810), распаковка в comprehensions (PEP 798) и встроенный sampling-профайлер Tachyon в модуле profiling.sampling. По скорости версия почти не отличается от 3.14, но экспериментальный JIT дал 1,2x на тесте с числами Фибоначчи (замер Мигеля Гринберга на 3.15.0rc3). С выходом 3.15 Python 3.10 официально снят с поддержки. Для авторов библиотек это значит, что минимальной версией можно делать 3.11. • Ленивые импорты сокращают время старта CLI-утилит. • Tachyon заменяет внешние профайлеры вроде py-spy. • Python 3.10 больше не поддерживается.

AI-обработка оригинала Simon Willison; редакция Hamidun News
Python 3.15 вышел: ленивые импорты, профайлер Tachyon и JIT на 1,2x быстрее
Источник: Simon Willison. Коллаж: Hamidun News.
◐ Слушать статью

Python 3.15 вышел в релиз. Для большинства разработчиков главное в нём — три вещи: явные ленивые импорты, профайлер Tachyon в стандартной библиотеке и новый синтаксис распаковки в списковых включениях. Скорость интерпретатора почти не изменилась по сравнению с 3.14, зато экспериментальный JIT впервые показал заметный прирост — 1,2x. Попутно Python 3.10 (2021 год) официально лишился поддержки. Для мейнтейнеров библиотек это важнее любого нового синтаксиса: нижняя планка совместимости сдвигается на 3.11. Обзор изменений для «What's new» в этом году подготовил релиз-менеджер версий 3.14 и 3.15 Хьюго ван Кемена́де.

Ленивые импорты, распаковка и Tachyon

Самое практичное нововведение — PEP 810. Модуль теперь можно объявить так: `lazy import json` или `lazy from pathlib import Path`. Реальный импорт произойдёт при первом обращении к символу. Разработчик Simon Willison, автор CLI-утилиты LLM с системой плагинов, давно упирался в эту проблему. Плагины с тяжёлыми зависимостями вроде `sentence_transformers` добавляли к каждому вызову команды `llm` несколько секунд. В документации для авторов плагинов ему приходилось советовать ручные ленивые импорты. Теперь это решается языком.

Второе изменение — PEP 798 (авторы Adam Hartz и Erik Demaine). Он добавляет распаковку внутрь comprehensions: `[L for L in lists]` разворачивает список списков в плоский, `{s for s in sets}` объединяет множества, `{**d for d in dicts}` сливает словари. Это продолжение PEP 448, который появился ещё в Python 3.5 в 2015 году.

Третье — профайлеры. Привычный трассирующий `cProfile` переименован в `profiling.tracing`. Рядом появился семплирующий `profiling.sampling`, он же Tachyon. Он периодически снимает стеки работающего процесса и считает, где тратится время. Накладные расходы низкие, а инструментировать код заранее не нужно. До сих пор для этого ставили внешние инструменты вроде py-spy. Теперь функция встроена в стандартную библиотеку.

На примере из обзора профайлер за 2,65 секунды собрал 2 651 сэмпл при частоте около 1000 в секунду. Нагляднее всего видно, что процесс почти всё время простаивал в ожидании цикла событий asyncio. Результат можно вывести в виде flame graph и heat map, а также в формате для интерфейса Firefox Profiler. На macOS для подключения к процессу по PID понадобился `sudo`.

Скорость: JIT наконец заметен

На ускорение «бесплатно» рассчитывать не стоит. Мигель Гринберг сравнил 3.15.0rc3 с 3.14 и нашёл, что производительность в основном осталась прежней. Исключение — экспериментальный JIT.

  • JIT против стандартного интерпретатора 3.15: 1,2x на тесте Фибоначчи.
  • Это первый случай, когда Гринберг увидел осмысленный прирост от JIT.
  • Для сравнения: в прошлом году 3.14 заметно обошёл 3.13 по значительно большему числу категорий.
  • Профайлер Tachyon: частота около 1000 сэмплов в секунду, без предварительной инструментации.

Как обновиться и что даёт отказ от 3.10

Если вы работаете с `uv`, переход занимает несколько команд. Сначала нужно обновить сам инструмент, чтобы он знал о новом релизе: `uv self update`. Затем ставим интерпретатор: `uv python install 3.15`. Чтобы сделать его версией по умолчанию для любых `uv run`, где проект не закрепил другую, выполняем `uv python pin --global 3.15`. Проверка: `uv run python --version`. Уже установленные утилиты переустанавливаются с нужной версией, например `uv tool upgrade datasette --python 3.15`.

Для мейнтейнеров интереснее обратная сторона. Политика Willison — поддерживать все живые версии Python. Раз 3.10 больше не поддерживается, можно опираться на возможности 3.11:

  • `tomllib` в стандартной библиотеке;
  • `asyncio.TaskGroup` и `asyncio.timeout()`;
  • `datetime.UTC` как алиас для `datetime.timezone.utc`;
  • в `sqlite3` — `setlimit()`/`getlimit()`, `create_window_function()`, `blobopen()` для частичного чтения больших BLOB и `set_authorizer(None)` для снятия авторизатора;
  • заметно расширенную систему типов.

В Datasette первый PR (№2998) уже убирает обходной путь для `set_authorizer(None)`. Шаблоны cookiecutter для click-app, datasette-plugin, python-lib и llm-plugin теперь тестируются на версиях с 3.11 по 3.15. Практический вывод для вашего проекта такой: проверьте матрицу CI, уберите 3.10 и добавьте 3.15. Ленивые импорты стоит сначала опробовать в CLI-инструментах с тяжёлыми зависимостями. Там выигрыш во времени старта виден сразу.

ЖХ
Hamidun News
AI‑новости без шума. Ежедневный редакторский отбор из 50+ источников. Продукт Жемала Хамидуна, Head of AI в Alpina Digital.
✦ Образовательная экосистема

Системное обучение работе с ИИ и AI-агентами

Образовательная платформа Vibe Academy (vibe-academy.ru) — практические курсы, промпт-инжиниринг, автоматизация процессов и прикладные AI-воркфлоу.

Перейти в Vibe Academy →Интенсив по Вайб-кодингу
Что вы думаете?
Загружаем комментарии…