- PVSM.RU - https://www.pvsm.ru -
Раньше виртуальная машина была написана в одном файле ceval.c [1] почти на 8 000 строк. Это делало работу с опкодами довольно сложной, особенно если нужно было провести эксперименты.
В Python 3.12 ее переписали на новый DSL. И теперь ее гораздо проще менять, оптимизировать и проводить эксперименты.
В качестве примера, можно посмотреть на попытку добавления register-based интерпретатора [2]. Другой пример, что часто два опкода идут вместе и выполняются последовательно большую часть времени. Например, LOAD_CONST и RETURN_VALUE. Для оптимизации, можно добавить новый опкод для этой операции, который вместо двух действий будет выполнять одно. Это может показаться небольшой оптимизацией, но на частых задачах получится неплохая прибавка к производительности.
Еще один пример: опкод CALL_FUNCTION сам по себе довольно медленный. У него есть целая семья оптимизаций, например специализация CALL_FUNCTION_ISINSTANCE, когда мы выкидываем промежуточный слой и сразу вызываем C-реализацию isinstance.
Минус подхода, что Python богатый язык и динамически типизирован. В runtime может что-то поменяться и получим замедление — придется сваливаться обратно на общий путь опкода CALL_FUNCTION.
Теперь для профайлинга python-приложений можно использовать perf. Если раньше при использовании perf можно было видеть только вызовы c-шных функций, что при дебаге python-приложения было бесполезно. С 3.12 в отчете perf-а будут видны вызовы python-функций и будет понятно, чем на самом деле занята ваша программа в процессе выполнения. Подробности с примерами можно посмотреть по ссылке [3].
distutils уже давольно давно считается устаревшим и выдавал Deprication Warning'и при использовании. Наконец в 3.12 планируют его удалять.
Но пока даже сам 3.12 не может работать без distutils. Его убрали из стандартной библиотеки. Эта история была согласована с главным потребителем distutil — pip. Сейчас distitutils нужен, если хочешь поменять грамматику и запустить анализатор Python.
Есть плюс в том, что у стандартной библиотеки есть плановое устаревание. Это позволяет не оказаться в ловушке обратной совместимости.
В трейсах будет больше информации о том, где разработчик допустил ошибку. Классно, что последние релизы направлены на улучшение usability языка. Это делает Python более дружелюбным языком программирования для новичков, да и старичкам будет чуть удобнее жить. Собственно эти изменения стали возможны благодаря новому парсеру, который переписали еще в прошлых версиях 3.9 и 3.10.
Появляется новый слой C-API — unstable. Теперь при добавлении нового функционала в C-API можно пометить как PyUnstable_ и это будет явно показывать тем, кто будет работать с этой функцией, что она нестабильная и может быть изменена или удалена. Это выглядит гораздо лучше, чем неочевидные варианты с подчеркиванием в имени.
Набор стандартных бенчмаркинговых машин расширили, чтобы включить macOS и Windows.
Команда разработчиков будет работать с крупными проектами, которые используют внутренние компоненты Python, чтобы помочь им вместить изменения в интерпретаторе CPython.
Внедрение os.path.isjunction() в стандартный библиотечный модуль os.
Новый метод pathlib.Path.walk() похожий на os.walk().
Удаление нескольких модулей и API, ранее устаревших в предыдущих версиях Python.
Полный список всех изменений можно посмотреть в официальной документации [4].
Можно найти в новом выпуске подкаста Moscow Python. Гостем эфира был Никита Соболев.
Посмотреть полный выпуск можно на ютубе:
А послушать на платформах Apple [5], Google [6], Spotify [7], Яндекс.Музыка [8], и сайте подкаста [9]
p.s. В следующем выпуске обсудим Copilot для Python-разработчика. Подключайтесь к эфиру 23 февраля [10] или слушайте нас в записи.
Автор: Михаил Корнеев
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/382931
Ссылки в тексте:
[1] ceval.c : https://github.com/python/cpython/blob/3.11/Python/ceval.c
[2] register-based интерпретатора: https://github.com/faster-cpython/ideas/issues/485
[3] ссылке: https://www.petermcconnell.com/posts/perf_eng_with_py12/
[4] официальной документации: https://docs.python.org/3.12/whatsnew/3.12.html
[5] Apple: https://podcasts.apple.com/ru/podcast/moscow-python-%D0%BF%D0%BE%D0%B4%D0%BA%D0%B0%D1%81%D1%82-%D0%BE-python-%D0%BD%D0%B0-%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC/id1429543935
[6] Google: https://podcasts.google.com/feed/aHR0cHM6Ly9wb2RjYXN0LnB5dGhvbi5ydS9mZWVkL3BvZGNhc3Q?sa=X&ved=0CBoQ27cFahcKEwjgt_yu64X9AhUAAAAAHQAAAAAQLA
[7] Spotify: https://open.spotify.com/show/5nETntpLPbjbxh3HLrKqCu
[8] Яндекс.Музыка: https://music.yandex.ru/album/6892837?dir=desc&activeTab=about
[9] сайте подкаста: https://podcast.python.ru/
[10] эфиру 23 февраля: https://www.youtube.com/watch?v=lKnMBGqguRo
[11] Источник: https://habr.com/ru/post/717420/?utm_source=habrahabr&utm_medium=rss&utm_campaign=717420
Нажмите здесь для печати.