Услуги Портфолио Контакты БлогНовости +7 (800) 511‑32‑27 Обсудить проект
Облако

Вышел Python 3.15: ленивые импорты, frozendict, UTF-8 по умолчанию и ускоренный JIT

20 октября 2026·5 мин чтения
Python 3.15Backend-разработка
Вышел Python 3.15: ленивые импорты, frozendict, UTF-8 по умолчанию и ускоренный JIT

Python 3.15.0 стал стабильным 9 октября 2026 года. Главное в релизе — ключевое слово lazy для отложенной загрузки модулей, встроенные типы frozendict и sentinel, UTF-8 как кодировка по умолчанию на всех платформах и JIT-компилятор, который наконец даёт заметный прирост. Перед переходом стоит проверить работу с файлами на Windows и профилирование.

Выпуск планировали на 1 октября, но за несколько дней до даты в ленивых импортах нашлись ошибки, и команде пришлось выпустить третий релиз-кандидат. В итоговую версию вошли 5 643 коммита от 1 012 участников. Для команд, у которых на Python держится backend-разработка и сервисы данных, это первый за несколько лет релиз, который меняет поведение по умолчанию, а не только добавляет возможности.

Ниже — что изменилось, что может сломаться и в каком порядке обновляться. Если вы выбираете стек для нового проекта, пригодится наш обзор, в котором собраны лучшие фреймворки для веб-разработки на Python.

Что нового в Python 3.15

  • Явные ленивые импорты (PEP 810). Строка lazy import json не загружает модуль, пока к имени не обратятся. По замеру, который приводит heise, скрипт с 13 модулями стандартной библиотеки на Apple M4 стартовал за 11 мс вместо 44 мс. Включить поведение для всего процесса можно переменной PYTHON_LAZY_IMPORTS=all.
  • frozendict (PEP 814). Неизменяемый словарь: записи нельзя добавить, удалить или заменить. Если значения хешируемые, такой словарь можно использовать как ключ.
  • sentinel (PEP 661). Встроенный тип для именованных маркеров. Помогает отличить «аргумент не передан» от явного None.
  • UTF-8 по умолчанию (PEP 686). Текстовые операции больше не зависят от локали системы.
  • Распаковка в генераторах списков, множеств и словарей (PEP 798) через * и **.
  • Пакет profiling (PEP 799) со статистическим профилировщиком Tachyon. cProfile объявлен устаревшим, удалить его планируют в 3.17.
  • Типизация: TypedDict с типизированными дополнительными ключами (PEP 728), TypeForm (PEP 747), непересекающиеся базовые классы (PEP 800).
  • Сборка: указатели фреймов включены по умолчанию (PEP 831), это упрощает профилирование в продакшене.

Насколько быстрее стал JIT

Экспериментальный JIT-компилятор впервые даёт выигрыш, который видно на общих бенчмарках. По данным Python Software Foundation, в среднем (по геометрическому среднему) он на 7–8% быстрее стандартного интерпретатора на x86-64 Linux и на 11–12% быстрее интерпретатора с хвостовыми вызовами на AArch64 macOS. JIT по-прежнему экспериментальный, поэтому включать его в продакшене стоит только после нагрузочного теста на вашем коде.

Ещё одна деталь: официальные установщики для macOS теперь по умолчанию ставят и сборку без GIL (free-threading). Сборки для 64-битной Windows используют интерпретатор с хвостовыми вызовами.

Что может сломаться при переходе

  1. Чтение и запись файлов без явной кодировки. Сильнее всего смена затронет Windows, где раньше бралась кодировка локали. Найти такие места поможет флаг -X warn_default_encoding. Временно вернуть старое поведение можно через PYTHONUTF8=0 или -X utf8=0.
  2. Код, который полагается на побочные эффекты импорта. Если модуль при импорте регистрирует плагины или меняет глобальное состояние, отложенная загрузка изменит порядок событий. Глобальный режим PYTHON_LAZY_IMPORTS=all включайте только после тестов.
  3. Скрипты и CI на cProfile. Пока он работает, но его стоит заменить на новый пакет profiling до выхода 3.17.
  4. GUI на Tkinter под macOS 27. В примечаниях к релизу сказано, что из-за изменений в ОС программы на Tkinter и IDLE могут зависать, если открыть диалог из меню.

Как обновляться

  1. Добавьте 3.15 в матрицу CI и прогоните тесты с флагом -X warn_default_encoding.
  2. Проверьте, что ключевые зависимости с C-расширениями собраны под 3.15. В релиз вошли изменения C API (PEP 782, 788, 793, 803, 820), поэтому старые колёса могут не подойти.
  3. Переводите на lazy import сначала тяжёлые импорты в CLI-утилитах и serverless-функциях. Там важнее всего время холодного старта.
  4. JIT и сборку без GIL проверяйте на отдельном стенде с нагрузочным тестом, а не на всём продакшене сразу.

Сроки поддержки: исправления ошибок будут выходить примерно раз в месяц в течение двух лет, патчи безопасности — до октября 2031 года.

Часто задаваемые вопросы

Нужно ли переписывать код под Python 3.15? В большинстве случаев нет. Новые возможности включаются явно. Главный риск — код, который полагался на кодировку локали при работе с файлами.

Ленивые импорты включены по умолчанию? Нет. Нужно либо писать lazy import, либо включить глобальный режим переменной окружения.

Стоит ли включать JIT в продакшене? JIT остаётся экспериментальным. Прирост в 7–12% — это среднее по бенчмаркам, на вашем коде он может отличаться.

Сколько будет поддерживаться 3.15? Исправления ошибок — около двух лет, обновления безопасности — до октября 2031 года.

Источники

Материал подготовлен редакцией YuSMP Group по открытым источникам. Нужна экспертиза по теме или разработка под задачу — обсудим проект.

Переведём ваш backend на Python 3.15

Найдём места, которые сломает UTF-8 по умолчанию, обновим зависимости с C-расширениями, подключим ленивые импорты там, где важен холодный старт, и проверим JIT под нагрузкой до выката в продакшен.

Обсудить модернизацию backend