Переписали виртуальную машину
Раньше виртуальная машина была написана в одном файле 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.
Полный список всех изменений можно посмотреть в официальной документации.
Больше деталей и мнений
Можно найти в новом выпуске подкаста Moscow Python. Гостем эфира был Никита Соболев.
Посмотреть полный выпуск можно на ютубе:
А послушать на платформах Apple, Google, Spotify, Яндекс.Музыка, и сайте подкаста
p.s. В следующем выпуске обсудим Copilot для Python-разработчика. Подключайтесь к эфиру 23 февраля или слушайте нас в записи.
Автор: Михаил Корнеев