Переписали виртуальную машину
Раньше виртуальная машина была написана в одном файле 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 уже довольно давно считается устаревшим и выдавал Deprecation Warning'и при использовании. Наконец в 3.12 планируют его удалять.
Но пока даже сам 3.12 не может работать без distutils. Его убрали из стандартной библиотеки. Эта история была согласована с главным потребителем distutil — pip. Сейчас distutils нужен, если хочешь поменять грамматику и запустить анализатор 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 февраля или слушайте нас в записи.
Комментарии (10)
santjagocorkez
00.00.0000 00:00+1Набор стандартных бенчмаркинговых машин расширили, чтобы включить macOS и Windows.
Фух... А то, знаете ли, реальность по кускам обратно склеивать пришлось.
Rastler
От GIL планировали уходить? Или все же нет?
grigoryvp
Планируют, но пока это очень долгосрочные и неуверенные планы.
EngineTech
Зато GIL заставляет следить за собой, не позволяя писать медленные монолиты.
loltrol
Он заставляет выталкивать любое не io в numpy/свой собственный сишный код :)