Вышел Python 3.15: ленивые импорты и профилировщик Tachyon

Вышел Python 3.15: ленивые импорты и профилировщик Tachyon

Вышел Python 3.15. Автор заметки от 12 октября 2026 года, разработчик open source, пересказывает главное из руководства «What's new in Python 3.15», которое в этом году составлял Hugo van Kemenade, релиз-менеджер версий 3.14 и 3.15. Попутно автор отмечает, что с выходом 3.15 версия Python 3.10 (выпущена в 2021 году) официально снята с поддержки, а значит, в своих проектах он может отказаться от 3.10 и начать использовать возможности из 3.11.

Самое интересное для автора, явные ленивые импорты из PEP 810. Синтаксис: lazy import json и lazy from pathlib import Path. Модуль загружается только при первом использовании его имён в последующем коде. У автора есть консольный инструмент LLM с плагинами; в документации для авторов плагинов ему приходилось советовать ручные ленивые импорты, потому что простая установка плагинов с тяжёлыми зависимостями вроде sentence_transformers могла добавлять по нескольку секунд к каждому вызову команды llm. Ленивые импорты решают именно эту проблему времени запуска.

Вторая новинка, распаковка во включениях (comprehensions) по PEP 798, авторы предложения Adam Hartz и Erik Demaine. Это расширение синтаксиса распаковки из PEP 448, который появился в Python 3.5 в 2015 году. Примеры из документации: [*L for L in lists] для [[1, 2], [3, 4], [5]] даёт [1, 2, 3, 4, 5]; {*s for s in sets} объединяет множества; {**d for d in dicts} объединяет словари, причём для ключа a в примере остаётся последнее значение 3.

Третья новинка, профилирование. Существующий трассирующий профилировщик переименован из cProfile в profiling.tracing, а рядом появился новый сэмплирующий профилировщик (на основе выборки) Tachyon, он же profiling.sampling. Такие профилировщики периодически снимают стеки вызовов у работающих процессов и по ним считают, в каких функциях проходит больше всего времени. Автор пишет, что у них очень низкие накладные расходы и они дают глубокое представление о работающих системах без предварительной инструментации. Раньше он пользовался для этого py-spy, теперь возможность встроена в стандартную библиотеку. Подключиться к процессу Python 3.15 по PID можно командой sudo uv run --python 3.15 python -m profiling.sampling attach 1234; на macOS автору потребовался sudo. После остановки по Ctrl+C показывается отчёт; профилировщик умеет строить флеймграфы (flame graphs) и тепловые карты и выводить данные в формате для интерфейса Firefox profiler.

По скорости 3.15 заметно не обгоняет 3.14. Miguel Grinberg проверил производительность на релиз-кандидате 3.15.0rc3 и нашёл её в основном такой же, как у 3.14, за исключением экспериментального JIT. JIT дал ускорение в 1,2 раза относительно стандартного интерпретатора 3.15 (на тесте с числами Фибоначчи), по словам автора заметки, впервые Miguel увидел ощутимый прирост от JIT. Прошлогодние замеры 3.14 показывали значимое ускорение относительно 3.13 в гораздо большем числе категорий.

Далее автор описывает, как перешёл на 3.15 через uv: обновил сам uv (uv self update), поставил стабильный релиз (uv python install 3.15), закрепил его версией по умолчанию (uv python pin --global 3.15) и переустановил уже имеющиеся инструменты, например uv tool upgrade datasette --python 3.15.

Наконец, о 3.11. Политика автора для основных проектов, поддерживать все актуальные версии Python, так что теперь он может опираться на возможности 3.11: наконец-то рассчитывать на модуль tomllib; использовать TaskGroup и timeout() в asyncio (Datasette активно использует asyncio); datetime.UTC как псевдоним datetime.timezone.utc; новые возможности SQLite, setlimit() и getlimit() для лимитов времени выполнения, create_window_function() для пользовательских оконных функций, blobopen() для частичного чтения и записи больших BLOB-значений, set_authorizer(None) для снятия авторизатора (в Datasette для этого был обходной путь). Плюс ряд улучшений системы типов. В ближайшие недели автор планирует внедрить улучшения 3.11 в несколько своих проектов; первый pull request в Datasette убирает обходной путь с set_authorizer(None). Шаблоны cookiecutter для click-app, datasette-plugin, python-lib и llm-plugin обновлены: тесты идут на версиях Python с 3.11 по 3.15.

Ключевые факты

  • Вышел Python 3.15; руководство «What's new» составлял Hugo van Kemenade, релиз-менеджер 3.14 и 3.15.
  • Явные ленивые импорты (PEP 810, lazy import json) откладывают загрузку модуля до первого использования и снимают задержки запуска из-за тяжёлых зависимостей плагинов.
  • Распаковка во включениях (PEP 798): [*L for L in lists] разворачивает вложенные списки, {**d for d in dicts} объединяет словари.
  • Новый сэмплирующий профилировщик Tachyon (profiling.sampling) в стандартной библиотеке; трассирующий cProfile переименован в profiling.tracing.
  • По скорости 3.15 в основном совпадает с 3.14; экспериментальный JIT дал 1,2x на тесте Фибоначчи (замер Miguel Grinberg на 3.15.0rc3). Python 3.10 больше не поддерживается.

Почему это важно

Релиз приносит сразу три заметные для повседневной работы новинки: явные ленивые импорты, распаковку во включениях и встроенный сэмплирующий профилировщик. Кроме того, с выходом 3.15 Python 3.10 официально снят с поддержки, и проекты, которые следуют за поддерживаемыми версиями, могут поднять минимальную планку до 3.11 и пользоваться tomllib, TaskGroup, timeout() и другими возможностями.

Кому это важно

Прежде всего разработчикам на Python и авторам open source библиотек и плагинов, которые поддерживают несколько версий языка. Ленивые импорты особенно полезны там, где запуск замедляют тяжёлые зависимости, например в консольных инструментах с плагинами. Профилировщик Tachyon пригодится тем, кому нужно разбираться с производительностью работающих процессов.

Как это применить

Чтобы попробовать 3.15 через uv: обновить сам uv (uv self update), установить релиз (uv python install 3.15), при желании закрепить его как версию по умолчанию (uv python pin --global 3.15) и переустановить нужные инструменты с флагом --python 3.15. Для профилирования запущенного процесса: sudo uv run --python 3.15 python -m profiling.sampling attach <PID>; на macOS автору понадобился sudo. Если проект поддерживает все актуальные версии, 3.10 можно убрать из матрицы тестов и начать использовать возможности 3.11; автор уже обновил свои шаблоны cookiecutter на тесты с 3.11 по 3.15.

Можно ли доверять

Это личная заметка практикующего разработчика, а не официальный анонс. Описание новинок опирается на документацию Python («What's new») и примеры из неё. Единственная цифра о скорости, 1,2x для JIT на тесте Фибоначчи, взята из замеров Miguel Grinberg на релиз-кандидате 3.15.0rc3, а не на финальной сборке и не из собственных бенчмарков автора. Точная дата выхода 3.15 в тексте не названа.

Риски и подводные камни

Ждать от 3.15 заметного ускорения не стоит: по замерам производительность в основном такая же, как у 3.14, а JIT остаётся экспериментальным. Для запуска профилировщика на macOS автору понадобился sudo. Перед установкой 3.15 через uv нужно обновить сам uv, иначе он не узнает о новом релизе. Использование возможностей 3.11 в проектах означает отказ от поддержки 3.10 в этих проектах, такова политика автора, у других проектов она может быть иной.