Главная Веб-разработка Python 3.12, 3.13 и 3.14: обновляться или нет? Разбираемся

Python 3.12, 3.13 и 3.14: обновляться или нет? Разбираемся

от admin

Эта статья поможет вам быстро разобраться, что нового появилось в версиях 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 и др.
Читать также:
OpenAI представила ИИ-модель o1 pro

Изменения в 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 канале

Похожие статьи