
Вышел Python 3.15 с новыми типами данных и улучшенным JIT
Python получил встроенный неизменяемый словарь и теперь по умолчанию работает с текстом в UTF-8. Стабильная версия Python 3.15.0 вышла 9 октября 2026 года. В ней также появились отложенные импорты, новый профилировщик и доработанный экспериментальный JIT-компилятор.
Новый тип sentinel позволяет создавать уникальные служебные значения. Он пригодится, например, когда функция должна различать «аргумент не передали» и «передали None»: обычный None не всегда подходит для обозначения отсутствующего значения.
Второй встроенный тип, frozendict, — словарь, в котором после создания нельзя добавлять и удалять элементы или заменять значения. Если все ключи и значения хешируемы, такой объект можно использовать как ключ другого словаря или элемент множества.
Однако frozendict не «замораживает» вложенные объекты. Если его значение — список, содержимое этого списка по-прежнему можно изменить. Неизменяемость относится к самому отображению ключей в значения.
Режим UTF-8 теперь включён по умолчанию. Это уменьшает зависимость чтения и записи текста от региональных настроек системы. Но приложения, которые рассчитывали на другую системную кодировку, могут столкнуться с ошибками или неверным отображением символов.
При переходе стоит проверить работу с файлами без явно указанного параметра encoding. Для файлов в прежней кодировке её нужно задать явно; если требуется именно кодировка окружения, предусмотрено encoding=»locale». PEP 686 также сохраняет возможность отключить режим UTF-8 через PYTHONUTF8=0 или -X utf8=0.
Для кода, выполняемого при старте интерпретатора, добавили файлы .start. Они содержат записи вида pkg.mod:callable: Python находит указанную функцию и вызывает её без аргументов. Такой формат упрощает проверку того, какой код запускается до основной программы.
Это не полная отмена файлов .pth. Их строки для расширения путей поиска модулей продолжают работать. Исполняемые import-строки объявлены устаревающими, но пока сохраняются; при наличии соответствующего .start-файла они игнорируются.
Экспериментальный JIT стал быстрее в тестах pyperformance. На x86-64 под Linux среднее геометрическое ускорение относительно стандартного интерпретатора с включёнными оптимизациями составило 7–8%. На AArch64 под macOS прирост достиг 11–12%, но там сравнение проводили с интерпретатором, использующим хвостовые вызовы.
Эти цифры не обещают одинакового ускорения всем приложениям. В документации Python 3.15 для отдельных тестов указан разброс от замедления примерно на 15% до ускорения более чем вдвое. JIT остаётся экспериментальным, поэтому эффект для конкретного проекта нужно измерять отдельно.
Ещё одна возможность ускорить запуск — явные отложенные импорты. Запись lazy import позволяет отложить загрузку модуля до первого использования. При этом меняется и момент появления ошибок импорта: они могут возникнуть позднее, когда программа обратится к модулю.
Новый статистический профилировщик Tachyon, доступный через profiling.sampling, помогает выяснить, на какой код программа тратит время. Он периодически считывает стек вызовов и может подключаться к уже работающему процессу без изменения его кода или перезапуска, при наличии необходимых прав доступа.
Также разработчики добавили распаковку элементов во включениях для списков, множеств и словарей, а также в генераторных выражениях. По сравнению с Python 3.14 выпуск объединяет 5643 коммита от 1012 участников. Установщики для Windows и macOS и исходный код доступны на странице релиза; перед обновлением рабочего проекта стоит проверить совместимость зависимостей и обработку текстовых файлов.