Python новый оптимизатор AST - PullRequest
0 голосов
/ 10 ноября 2018

из питона 3.7 что нового

Постоянное свертывание перемещено из оптимизатора глазка в новый оптимизатор AST, который может выполнять оптимизацию более последовательно

Какую оптимизацию способен выполнить этот новый оптимизатор AST и чем он отличается от оптимизатора глазка?

1 Ответ

0 голосов
/ 11 ноября 2018

Если вы прочитали связанную ошибку отчеты , они содержат большинство деталей. Большинство из них довольно сухие вещи, которые на самом деле не имеют значения для большинства кода, поэтому они не включают детали в «Что нового».

Примерами, где это имеет значение, обычно являются странные случаи, которые встречаются редко, но с которыми не может справиться оптимизатор глазка (который не может выполнить оценку более высокого уровня, просто перезаписывается простой байт-код), например на Python 3.6:

>>> import dis
>>> dis.dis('if True: pass')  # Recognizes simple case and omits whole block
  1           0 LOAD_CONST               0 (None)
              2 RETURN_VALUE
>>> dis.dis('if True and 1: pass')  # Can't recognize more complex case
  1           0 LOAD_CONST               0 (True)
              2 POP_JUMP_IF_FALSE        8
              4 LOAD_CONST               1 (1)
              6 POP_JUMP_IF_FALSE        8
        >>    8 LOAD_CONST               2 (None)
             10 RETURN_VALUE

тогда как на 3,7:

>>> import dis
>>> dis.dis('if True: pass')  # Recognizes simple case and omits whole block
  1           0 LOAD_CONST               0 (None)
              2 RETURN_VALUE
>>> dis.dis('if True and 1: pass')  # Handles more complex case too
  1           0 LOAD_CONST               0 (None)
              2 RETURN_VALUE
...