
Python 3.15 вышел 12 октября 2026 года. Для разработчиков инструментов на базе LLM наиболее заметными изменениями стали явные отложенные импорты, семплирующий профилировщик в стандартной библиотеке и новые возможности работы с коллекциями.
Релиз также меняет нижнюю границу совместимости для проектов, которые поддерживают все актуальные версии Python. По словам разработчика Simon Willison, выход Python 3.15 позволяет его проектам отказаться от Python 3.10 и начать использовать функции, появившиеся в Python 3.11.
Отложенные импорты могут ускорить холодный запуск CLI
PEP 810 добавляет в Python явный синтаксис для отложенной загрузки модулей:
python
lazy import json
lazy from pathlib import Path
При таком объявлении модуль не загружается во время запуска программы. Импорт выполняется при первом обращении к соответствующему имени.
Для небольших скриптов эффект может быть незаметным. Другое дело — командные инструменты с системой плагинов. Willison рассказал, что его LLM CLI поддерживает подключаемые расширения, а некоторые из них используют тяжёлые зависимости, включая `sentence_transformers`. Ранее установка такого плагина могла увеличивать время каждого запуска команды на несколько секунд даже в тех случаях, когда функциональность плагина не использовалась.
Отложенные импорты позволяют не загружать такие зависимости заранее. Это не ускоряет сам первый импорт и не уменьшает размер библиотеки, однако переносит его стоимость на момент фактического вызова функции. Для LLM-агентов и CLI это особенно полезно при холодном запуске, когда пользователю приходится ждать и инициализацию приложения, и подготовку подключённых расширений.
Механизм описан в PEP 810: https://peps.python.org/pep-0810/
При переходе на новый синтаксис разработчикам потребуется проверить побочные эффекты импорта. Код, который рассчитывает на выполнение действий уже во время запуска модуля, может вести себя иначе при ленивой загрузке.
Распаковка появилась непосредственно во включениях
Python 3.15 расширяет синтаксис включений списков, множеств и словарей. Вложенные коллекции теперь можно распаковывать прямо внутри выражения:
python
lists = [[1, 2], [3, 4], [5]]
[*items for items in lists]
# [1, 2, 3, 4, 5]
Для множеств используется аналогичная форма:
python
sets = [{1, 2}, {2, 3}, {3, 4}]
{*items for items in sets}
# {1, 2, 3, 4}
А для словарей:
python
dicts = [{«a»: 1}, {«b»: 2}, {«a»: 3}]
{item for item in dicts}
# {«a»: 3, «b»: 2}
В последнем примере повторяющийся ключ `a` получает значение из последнего словаря. Новая возможность описана в PEP 798, подготовленном Adam Hartz и Erik Demaine: https://peps.python.org/pep-0798/
Для разработчиков AI-приложений это может упростить обработку результатов нескольких источников, списков документов и наборов параметров перед передачей данных модели. Однако компактная запись не заменяет проверку структуры входных данных: если один из элементов имеет неожиданный тип, ошибка возникнет во время выполнения.
В стандартной библиотеке появился семплирующий профилировщик
Ещё одно изменение связано с анализом производительности. Прежний трассирующий профилировщик теперь доступен как `profiling.tracing`. Вместе с ним появился семплирующий профилировщик `profiling.sampling`, также называемый Tachyon.
Семплирующий профилировщик через определённые интервалы снимает стеки вызовов работающего процесса. Затем по собранным данным можно оценить, какие функции занимают больше времени. Такой подход обычно требует меньше подготовительных изменений в приложении, чем инструменты, которым нужно заранее добавлять инструментацию.
Willison ранее использовал для этой задачи отдельные программы, включая `py-spy`. В Python 3.15 он подключался к уже работающему процессу командой:
bash
sudo uv run —python 3.15 python -m profiling.sampling attach 1234
После наблюдения за приложением сбор данных останавливается сочетанием `Ctrl+C`. Профилировщик умеет формировать отчёты, пламенные графики, тепловые карты и данные для просмотра в Firefox Profiler.
Для LLM-сервисов и агентов такой анализ помогает отделить задержки самой модели от затрат на загрузку плагинов, подготовку контекста, обращение к базе данных или сетевые операции. Но семплирование не даёт полного журнала всех вызовов: короткое наблюдение может не захватить редко выполняемую ветку кода. Результаты нужно интерпретировать с учётом длительности теста и реального сценария нагрузки.
Python 3.15 не обещает общего ускорения
Независимого подтверждения заметного ускорения всех программ после перехода на Python 3.15 в исходном материале нет. Miguel Grinberg сравнил производительность версии 3.15.0rc3 с Python 3.14 и пришёл к выводу, что в большинстве проверенных сценариев показатели близки.
Исключением стал экспериментальный JIT-компилятор. В тесте с вычислением чисел Фибоначчи он показал ускорение примерно в 1,2 раза по сравнению со стандартным интерпретатором Python 3.15. Это результат отдельного вычислительного теста, а не оценка типичного LLM-приложения.
Для агентов и CLI с большим количеством операций ввода-вывода переход на Python 3.15 сам по себе не гарантирует меньшую задержку. На практике больший эффект может дать перенос тяжёлых импортов, поиск медленных участков в профилировщике и настройка работы с внешними сервисами.
Сравнение Grinberg опубликовано здесь: https://blog.miguelgrinberg.com/post/how-fast-is-python-3-15
Выход Python 3.15 позволяет отказаться от Python 3.10
Согласно обзору Willison, после выхода Python 3.15 Python 3.10 перестаёт входить в набор поддерживаемых версий, на который он ориентируется в своих проектах. Это позволяет использовать API Python 3.11 без сохранения совместимости с более старой версией.
Среди таких возможностей:
- `tomllib` для разбора TOML;
- `asyncio.TaskGroup` для управления группами асинхронных задач;
- `asyncio.timeout()` для ограничения времени выполнения;
- `datetime.UTC` как короткое имя для UTC;
- дополнительные функции SQLite;
- расширения системы типизации.
В интерфейсе SQLite для Python 3.11 появились `setlimit()` и `getlimit()` для управления ограничениями SQLite, `create_window_function()` для создания оконных функций и `blobopen()` для частичного чтения и записи больших BLOB-значений. Также вызов `set_authorizer(None)` позволяет отключить авторизатор SQLite — это даёт возможность удалить обходной код из Datasette.
Полный список изменений Python 3.11 опубликован в документации: https://docs.python.org/3.11/whatsnew/3.11.html
Как проверить окружение перед обновлением
Для установки Python 3.15 Willison использовал менеджер окружений `uv`:
bash
uv self update
uv python install 3.15
uv python pin —global 3.15
uv run python —version
Приложения, установленные через `uv tool`, можно обновить с указанием новой версии Python:
bash
uv tool upgrade datasette —python 3.15
Перед обновлением LLM-инструмента стоит проверить три вещи: совместимость зависимостей, сборку нативных расширений и работу плагинов при холодном запуске. Отдельно следует сравнить запуск до и после перехода с Python 3.10 на Python 3.15: новая версия языка может упростить поддержку и диагностику, но это не является гарантией ускорения всего приложения.









