Python откажется от встроенного JIT: PEP 836 отозван, компилятор уберут из main

19 октября 2026 года Саванна Островски на форуме discuss.python.org объявила, что авторы отзывают PEP 836. Это был документ, по которому экспериментальный JIT-компилятор CPython должен был стать нормальной, поддерживаемой частью языка. Без принятого PEP компилятор по решению управляющего совета Python (Steering Council) уходит из ветки main, а значит, в будущей Python 3.16 его не будет.

Тем, кто просто запускает Python на сервере, переписывать ничего не придётся: JIT и так был выключен по умолчанию, а код с ним и без него работает одинаково. Новость важна тем, кто включал его ради скорости, собирает Python сам или следил за обещаниями ускорить CPython.

Что такое JIT в CPython и сколько он давал

JIT появился в main в Python 3.13. Он компилирует часто выполняемые участки кода в машинный код прямо во время работы программы. Устроен он по схеме copy-and-patch: машинный код не пишется вручную, а собирается из шаблонов, которые при сборке Python готовит LLVM.

По данным самого PEP 836, в Python 3.15 JIT ускорял набор бенчмарков pyperformance в среднем на 4-12% в зависимости от машины: 12,6% на M3 Pro с macOS, около 7% на Linux с x86-64 и aarch64, 4,7% на Windows. Официальные сборки Python для Windows и macOS идут с собранным, но выключенным JIT, включается он переменной окружения PYTHON_JIT=1. Так же поступают Fedora и Gentoo.

Как дошло до отзыва: условие совета от 5 июня

5 июня 2026 года управляющий совет написал на форуме, что JIT слишком долго живёт в main на правах эксперимента. Единственный документ о нём, PEP 744, был информационным и оставил открытыми главные вопросы: кто будет поддерживать компилятор, как он уживётся с отладчиками и профилировщиками, какие обязательства лягут на сборщиков дистрибутивов.

Совет попросил полноценный PEP (Standards Track) и до его принятия запретил вливать в main новые функции и оптимизации JIT, разрешив только исправления ошибок и уязвимостей. На всё дали полгода: если PEP за это время не примут, код JIT убирают из основной ветки, а разработка продолжается в отдельном репозитории.

Что предлагал PEP 836

PEP написали Саванна Островски, Кен Джин и Брандт Бухер. Они предлагали не объявлять JIT готовым сразу, а дать ему 2,5 года и чёткие цели:

  • к первой бете Python 3.16 перейти от записи трасс к компиляции целых функций (method-based) и сделать JIT совместимым со сборкой без GIL (free-threading);
  • к первой бете Python 3.17 ускорить сборку без GIL с JIT минимум на 20% по сравнению с той же сборкой без JIT, а в обычной сборке не опускаться ниже 5%;
  • прогнать тесты популярных пакетов с PyPI под JIT и не ломать профилировщики и отладчики, включая pdb, sys.monitoring и sys._getframe;
  • дать дистрибутивам понятный способ собирать JIT без привязки к одной конкретной версии LLVM.

Как пишет InfoWorld со ссылкой на LWN, совету этого не хватило: в PEP, по его оценке, мало конкретики о поддержке, о том, как мерить скорость, и о работе с отладчиками и профилировщиками, а ожидаемый выигрыш выглядел слишком оптимистично. Островски в ответ написала, что совет справедливо ставит высокую планку, а у авторов нет сил довести нынешнюю версию PEP до конца. Направление работы они по-прежнему считают верным и обещают выложить свою реализацию со ссылкой из отозванного PEP, чтобы её могли развивать другие.

Как проверить, включён ли JIT у вас

Начиная с Python 3.14 в модуле sys есть функции sys._jit. Первая показывает, собран ли интерпретатор с JIT, вторая говорит, включён ли он в текущем процессе:

python3 -c "import sys; print(sys._jit.is_available(), sys._jit.is_enabled())"

# если JIT включали явно, найти это можно так
grep -rn "PYTHON_JIT" /etc/systemd /etc/environment ~/.bashrc 2>/dev/null

Если оба значения False, вас это вообще не касается. Если JIT включали через PYTHON_JIT=1 в unit-файле, Dockerfile или CI, на Python с 3.13 по 3.15 он продолжит работать как раньше. Но при переезде на 3.16 этот прирост в несколько процентов, скорее всего, пропадёт, и на это стоит заложиться заранее.

Что остаётся тем, кому нужна скорость

Ускорение CPython никуда не делось. Адаптивный интерпретатор с Python 3.11 подбирает специализированный байткод под типы данных и работает без всяких настроек. Для тяжёлых вычислений остаются PyPy со своим JIT, который на части программ быстрее CPython на порядок и больше, но хуже дружит с расширениями на C, а также GraalPy, CinderX, Numba и torch.compile для своих задач.

В итоге встроенный JIT в CPython пока заканчивается: PEP 836 отозван 19 октября, код уберут из main, и в Python 3.16 его не ждите. Вашему коду это ничего не меняет, а тем, кто включал PYTHON_JIT=1, стоит заранее прикинуть, сколько он реально давал на их нагрузке. Желающих продолжить работу никто не останавливает, но вернуться в CPython JIT сможет только через новый PEP и ту же высокую планку.

Источники и ссылки


Комментарии загружаются…