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

Kate

Administrator
Команда форума

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

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

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

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

Еще один пример: опкод 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.
Полный список всех изменений можно посмотреть в официальной документации.


 
Сверху