Эта статья поможет вам быстро разобраться, что нового появилось в версиях 3.12, 3.13 и 3.14 и решить для себя, пришло ли время обновляться. Основной упор сделан на ключевые нововведения, чтобы составить общую картину и понять куда развивается язык.
040 открытий256 показов
Сегодня разберемся, что нового появилось в версиях 3.12, 3.13, 3.14, и решить, пришло ли время обновить проект. Основной упор сделан на ключевые нововведения, чтобы составить общую картину и понять, куда развивается язык.
По итогам 2023 года JetBrains публиковали статистику, в которой основная версия Python 3.11 во многих компаниях всё еще использовалась с долей 27%. На втором месте Python 3.10 с долей 26%. Свежих данных по итогу 2024 года еще нет, но по моим скромным опросам 3.11 всё еще лидирует во многих компаниях. Обновляться на 3.12 и 3.13 никто не спешит. Почему?
Для начала давайте разберем все изменения, которые накопились за два года.
Python 3.12 — ключевые изменения
Улучшенные f-строки
Теперь внутри выражений f-строк можно использовать практически любые валидные конструкции Python:
- Многострочные выражения;
- Те же кавычки, что и у f-строки;
- Бэкслэши и юникод-escape-последовательности;
- Комментарии внутри выражений.
Это снимает многие ограничения, упрощает написание f-строк и улучшает читаемость кода.
Изменения описаны в PEP-701
«Персональный» GIL для каждого сабинтерпретатора
Добавлена (на уровне C-API) возможность создавать субинтерпретаторы, у каждого из которых свой собственный GIL. Это прокладывает путь к полноценному параллелизму в Python за счёт использования Sub-Interpreters API (в будущем ожидается удобный Python-интерфейс).
Вышел обновленный VSCode. 90% его функций связаны с ИИ-помощником Copilottproger.ru
Изменения описаны в PEP-684
Новая система мониторинга исполнения
Позволяет профилировщикам, отладчикам и другим инструментам «подписываться» на события в интерпретаторе (вызовы функций, переходы по строкам кода, исключения и т. п.) с минимальными накладными расходами. Теперь можно гибко настраивать, какие события отслеживать, а какие – нет.
Изменения описаны в PEP-669
Оптимизации comprehension
Списковые, словарные и множественные (set) генераторы теперь «инлайнены» (ранее генерировалась скрытая функция). Это позволяет ускорить comprehension почти в 2 раза.
Изменения описаны в PEP-709
Удаление distutils
Модуль distutils, долгое время используемый для управления сборкой и дистрибуцией Python-проектов, наконец-то полностью удалён из стандартной библиотеки в Python 3.12. Это решение было запланировано заранее и сопровождалось подробным руководством по миграции.
Другие важные моменты
typing
: появились новые возможности (PEP-692 и PEP-698) — более гибкая аннотация**kwargs
через TypedDict, а также декоратор@override;
- Внутри
asyncio
улучшена производительность (например, отправка данных через сокеты без лишнего копирования и др.); - В
sqlite3
добавлен CLI-режим, теперь можно запускатьpython -m sqlite3;
- Улучшены ошибки типа
NameError
: «Did you forget to import ‘sys’?» и т. д.
Итого: 3.12 сфокусирован на удобстве (f-строки), оптимизации (comprehension, asyncio) и на дальнейшей подготовке к «многопоточному» Python за счёт независимых GIL.
Подробнее: What’s New In Python 3.12
Python 3.13 — ключевые изменения
Новый интерактивный интерпретатор
По умолчанию запускается «улучшенная» REPL (наработки из PyPy):
- Многострочное редактирование;
- История (F2) с пропуском вывода и префиксов
>>>
/...;
- «Paste mode» (F3);
- Цветные трейсы (
traceback
) и подсветка ошибок.
Экспериментальное отключение GIL
Добавлена опция сборки CPython без GIL. Пока что это экспериментальная опция падения производительности в однопоточном режиме и несовместимость с большинством пакетов, которые еще не адаптированы для работы без GIL.
Изменения описаны в PEP-703
JIT-компилятор
Экспериментальный JIT в CPython (доп. опция сборки) пока отключён по умолчанию и даёт лишь небольшой прирост производительности, но ожидаются улучшения в будущих версиях.
JIT-компилятор (Just-In-Time) в Python ускоряет выполнение кода, превращая часто исполняемые части в машинный код прямо во время работы программы. Это даёт прирост производительности, особенно в интенсивных вычислениях, без необходимости переписывать код. В отличие от стандартной интерпретации, JIT оптимизирует «горячие» участки, сохраняя совместимость с Python, но пока остаётся экспериментальной функцией.
Изменения описаны в PEP-744
Улучшения в стандартной библиотеке
Что произошло:
- Новые модули и функции:
dbm.sqlite3
,base64.z85encode()/z85decode();
copy.replace()
для быстрого создания «копий с изменениями» (аналогdataclasses.replace()
, но для большинства встроенных типов);random
теперь имеет CLI:python -m random;
- Массовое удаление старых (deprecate) модулей (PEP 594) — убраны
cgi
,telnetlib
,imp
,aifc
,audioop
и др.
Изменения в typing
- TypeVar, ParamSpec и TypeVarTuple теперь могут иметь значения по умолчанию (PEP 696);
warnings.deprecated()
(PEP 702) для единого способа помечать устаревшие функции и классы (как на уровне типов, так и в рантайме);ReadOnly
дляTypedDict;
- Прочие полезные мелочи.
Продление срока поддержки
PEP-602 теперь даёт новым релизам (начиная с 3.13) 2 года фича-апдейтов и 3 года security-апдейтов.
Итого: 3.13 продолжает курс на эксперименты с полной «многопоточностью» (free-threading CPython), вводит JIT, улучшает REPL и продолжает чистить стандартную библиотеку от «мертвых» модулей.
Подробнее: What’s New In Python 3.13
Python 3.14 — ключевые изменения
Полноценный выпуск 3.14 запланирован на октябрь 2025 года, но уже сейчас мы имеем представление о том, что войдет в эту версию.
Отложенная оценка аннотаций
Аннотации теперь не вычисляются сразу, а откладываются до тех пор, пока они не понадобятся. Это снижает накладные расходы при определении функций и классов, устраняя необходимость писать аннотации в кавычках для «forward references».
Изменения описаны в PEP-649
Новая Python Configuration С-API
Расширяет функциональность PEP 587, упрощает и унифицирует процесс конфигурирования Python и его встроенного использования.
Проще — лучше, но для обычных разработчиков на Django/FastAPI это пройдет максимально незаметно.
Реализуем задачи на Go (и не только): самая подробная шпаргалкаtproger.ru
Изменения описаны в PEP-741
Новые возможности языка
map()
теперь имеет флагstrict=True
по аналогии сzip(strict=True)
— проверяет, что все итерации одной длины;- Добавлены методы
float.from_number()
иcomplex.from_number()
для конверсии чисел (но не строк!); - Возможность установить уровень detail для
dis
(например,--show-positions
,--specialized
) и т. д; - Поддержка UUID v8 (uuid.uuid8()) и SHA-256 digest auth в
urllib.request
.
Улучшение ошибок
- При неправильном распаковочном присваивании теперь показывается фактическое число элементов «got X»;
- Расширены диагностические сообщения в разных участках (например, в
ImportError
);
- Убран ряд deprecated методов и функционала в модулях
ast
,asyncio
,itertools
,pkgutil
и т. д.
Оптимизация
- Точки останова и отладка (breakpoint) переиспользуют один экземпляр
Pdb;
- Улучшен механизм auto-слежения за процессом (profiling, trace). Меньше накладных расходов при профилировании;
- Множество мелких доработок в модулях и стандартных функциях (например,
io
,random
,multiprocessing
).
Итого: 3.14 продолжает курс на улучшение аннотаций (включая отложенную их оценку), вносит мелкие синтаксические удобства, серьёзно расширяет и оптимизирует стандартную библиотеку, удаляет много устаревшего кода.
Подробнее: Python 3.14 Changelog
Кратко о том, что изменилось:
- 3.12 — крупные шаги в сторону удобства (f-strings, классные улучшения asyncio), чистка старья (
distutils
) и подготовка к независимым GIL; - 3.13 — экспериментальный free-threading (полное отключение GIL), базовый JIT, улучшенный REPL, удаление целого набора древних модулей, новые возможности в typing;
- 3.14 — отложенная оценка аннотаций, дальнейшие улучшения C API, новые фичи в базовых функциях (
map(strict=…)
, и т. д.), подчистка долгих депрекейтов.
Можно сделать только один вывод. Если вы сейчас работаете на версии 3.11, то особого смысла обновляться всё еще нет. Большая часть нововведений лишь готовит почву для более серьезных изменений. Для внедрения NoGIL как полноценного инструмента может понадобиться больше 5 лет.
Внятных бенчмарков, которые показывают прирост производительности «в бою» для популярных фреймворков не существует, так что здесь сложно сделать какие-то обоснованные выводы.
С точки зрения безопасности — для 3.11 патчи будут выходить до октября 2026 года, так что имеет смысл периодически «накатывать» новые минорные версии, чтобы закрыть известные уязвимости. До появления проблем с версиями пакетов, которые будут сбрасывать поддержку 3.11, ждать еще как минимум пару лет.
Итого, самым разумным решением будет дождаться релиза 3.14 в октябре. К тому времени подтянется и поддержка этой версии у большинства популярных пакетов, а еще станет понятней судьба всех «экспериментальных» нововведений.
Больше про разработку рассказываю в своем Telegram канале