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

Раньше виртуальная машина была написана в одном файле 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)


  1. Rastler
    00.00.0000 00:00
    +5

    От GIL планировали уходить? Или все же нет?


    1. grigoryvp
      00.00.0000 00:00
      +3

      Планируют, но пока это очень долгосрочные и неуверенные планы.


    1. EngineTech
      00.00.0000 00:00
      +1

      Зато GIL заставляет следить за собой, не позволяя писать медленные монолиты.


      1. loltrol
        00.00.0000 00:00

        Он заставляет выталкивать любое не io в numpy/свой собственный сишный код :)


  1. NBN
    00.00.0000 00:00
    +2

    До релиза Python 3.12 ещё 8 месяцев. И новые фичи ещё будут вносить две альфа версии. По-моему, рановато писать статью с таким заголовком.


    1. grigoryvp
      00.00.0000 00:00
      +3

      Все правильно, будут вносить. И будет хороший повод еще раз собраться и обсудить финальный список.


  1. penetration
    00.00.0000 00:00
    +5

    Когда JIT будет?


    1. insecto
      00.00.0000 00:00
      +1

      Сто лет как есть, graalvm


      1. penetration
        00.00.0000 00:00
        +3

        Я про нативную поддержку


  1. santjagocorkez
    00.00.0000 00:00
    +1

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

    Фух... А то, знаете ли, реальность по кускам обратно склеивать пришлось.