Динамическая настройка оптимизации интерпретатора Python во время выполнения - PullRequest
1 голос
/ 02 октября 2019

После некоторого времени поиска здесь дубликатов единственное, что я нахожу, это отсутствие операций и оптимизация с Cython, который совершенно не связан. Что я пытаюсь сделать, это динамически установить флаг python -O во время выполнения .

По сути, есть одно значение sys.flags.optimize, которое доступно только для чтения. Я ищу вариант, чтобы изменить его или найти место, в котором это значение может быть изменено и влияет на генерацию байт-кода.

В соответствии с doc официальный способ - назвать егопрежде чем переводчик раскрутится, так что мне интересно, если это вообще возможно, однако вот что я нашел:

Кажется, что py_compile называется "где-то"Msgstr "(Поиск в GitHub показывает только документ или тесты, а не фактический вызывающий во время выполнения) и управляет optimization_level в compiler.c сверху. Это означало бы, что я могу изменить его в Python и заставить скомпилированный интерпретатор собрать мой код с и без оптимизаций в одном сеансе / процессе.

Я не могу найти синтаксический анализ параметров CLI, ни каких-либо связанных "состояние ", которое можно изменить во время выполнения.

Моя цель (на данный момент) - опционально разрешить / удалить ключевое слово assert, что может быть сделано только -O (через compiler_assert()* 1042). * для этого нужен установленный уровень, однако я изо всех сил пытаюсь найти «недостающую связь» между CST, строящим код C, и реальным кодом Python, который, кажется, содержит состояние конфигурации (поскольку py_compile содержит необработанные значения optimize) ипохоже компилирует и загружает байт-код для самого интерпретатора.

Есть ли способ изменить optimization_level, чтобы я мог добиться такого поведения и в значительной степени сделать это за один сеанс Python?

>>> # change optimize to 1
>>> def test(): assert True
>>> import dis
>>> dis.dis(test)
  1           0 LOAD_CONST               0 (None)
              2 RETURN_VALUE
>>> # change optimize to 0
>>> dis.dis(test)
  1           0 LOAD_CONST               1 (True)
              2 POP_JUMP_IF_TRUE         8
              4 LOAD_GLOBAL              0 (AssertionError)
              6 RAISE_VARARGS            1
        >>    8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
...