Что нам несет Python 3.12

41505e62e588cadea2c6c9b15b6aa791

Переписали виртуальную машину

Раньше виртуальная машина была написана в одном файле ceval.c  почти на 8 000 строк. Это делало работу с опкодами довольно сложной, особенно если нужно было провести эксперименты. 

В Python 3.12 ее переписали на новый DSL. И теперь ее гораздо проще менять, оптимизировать и проводить эксперименты.

В качестве примера, можно посмотреть на попытку добавления register-based интерпретатора. Другой пример, что часто два op-кода идут вместе и выполняются последовательно большую часть времени. Например, LOAD_CONST и RETURN_VALUE. Для оптимизации, можно добавить новый op-код для этой операции, который вместо двух действий будет выполнять одно. Это может показаться небольшой оптимизацией, но на частых задачах получится неплохая прибавка к производительности. 

Еще один пример: опкод CALL_FUNCTION сам по себе довольно медленный. У него есть целая семья оптимизаций, например специализация CALL_FUNCTION_ISINSTANCE, когда мы выкидываем промежуточный слой и сразу вызываем C-реализацию isinstance.

Минус подхода, что Python богатый язык и динамически типизирован. В runtime может что-то поменяться и получим замедление — придется сваливаться обратно на общий путь опкода CALL_FUNCTION.

Интеграция с Linux perf

Теперь для для профайлинга python-приложений можно использовать perf. Если раньше при использовании perf можно было видеть только вызовы c-шных функций, что при дебаге python-приложения было бесполезно. С 3.12 в отчете perf-а будут видны вызовы python-функций и будет понятно, чем на самом деле занята ваша программа в процессе выполнения. Подробности с примерами можно посмотреть по ссылке.

Выкидываем distutils 

distutils уже давольно давно считается устаревшим и выдавал Deprication Warning’и при использовании. Наконец в 3.12 планируют его удалять.

Но пока даже сам 3.12 не может работать без distutils. Его убрали из стандартной библиотеки. Эта история была согласована с главным потребителем distutil — pip. Сейчас distitutils нужен, если хочешь поменять грамматику и запустить анализатор Python. 

Есть плюс в том, что у стандартной библиотеки есть плановое устаревание. Это позволяет не оказаться в ловушке обратной совместимости. 

Улучшение сообщений об ошибках

В трейсах будет больше информации о том, где разработчик допустил ошибку. Классно, что последние релизы направлены на улучшение usability языка. Это делает Python более дружелюбным языком программирования для новичков, да и старичкам будет чуть удобнее жить. Собственно эти изменения стали возможны благодаря новому парсеру, который переписали еще в прошлых версиях 3.9 и 3.10.

C-API tier 

Появляется новый слой C-API — unstable. Теперь при добавлении нового функционала в C-API можно пометить как PyUnstable_ и это будет явно показывать тем, кто будет работать с этой функцией, что она нестабильная и может быть изменена или удалена. Это выглядит гораздо лучше, чем неочевидные варианты с подчеркиванием в имени.

Другие обновления 

  • Набор стандартных бенчмаркинговых машин расширили, чтобы включить macOS и Windows.

  • Команда разработчиков будет работать с крупными проектами, которые используют внутренние компоненты Python, чтобы помочь им вместить изменения в интерпретаторе CPython.

  • Внедрение os.path.isjunction() в стандартный библиотечный модуль os.

  • Новый метод pathlib.Path.walk() похожий на os.walk().

  • Удаление нескольких модулей и API, ранее устаревших в предыдущих версиях Python.

Полный список всех изменений можно посмотреть в официальной документации.

Больше деталей и мнений

Можно найти в новом выпуске подкаста Moscow Python. Гостем эфира был Никита Соболев.

Посмотреть полный выпуск можно на ютубе:

А послушать на платформах Apple,   Google, Spotify, Яндекс.Музыка, и сайте подкаста

p.s. В следующем выпуске обсудим Copilot для Python-разработчика. Подключайтесь к эфиру 23 февраля или слушайте нас в записи.

© Habrahabr.ru