возможности быстрого динамического выполнения кода в Python
У меня есть некоторый код, доступный в некоторой форме AST, и я хотел бы его выполнить.
Я могу придумать несколько способов сделать это, например:
- просто передн интерпретировать его.
- перевести его в Python AST (модуль
ast
) и- Python -
compile
это или - Python -
eval
это.
- Python -
- перевести его в исходный код Python (например, чистую строку) и
- Python -
compile
это или - Python -
eval
тот.
- Python -
- переведите его в какую-нибудь форму низкоуровневого кода и напишите простую виртуальную машину на Python, которая его запускает.
Я думаю, что я бы получил ускоренное выполнение, переведя его в Python AST, compile
и запустив это. Исп.. при использовании данных, я мог бы даже сделать улучшений PyPys оптимизаций JIT-компиляцию (я надеюсь, что я делаю, делать я?).
2 ответа:
Еще одна возможность: перевести AST непосредственно в байтовый код Python и выполнить его. Это похоже на вашу последнюю идею, за исключением использования существующей виртуальной машины Python.
Это не отличная возможность, потому что это может быть много работы, и Python
compile
, вероятно, сделает лучшую работу, за исключением довольно специфических случаев, но я просто выбрасываю ее.
Другая возможность: перевести в кодCython , записать в файл, скомпилировать с помощью Cython, затем компилятор C с включенной оптимизацией, загрузить полученный модуль и выполнить его.
Если код содержит аннотации типов, которые могут быть переведены в типы Cython/C, это может быть очень быстро. Однако будьте осторожны, поскольку Cython находится в бета-состоянии и все еще немного груб по краям. Кроме того, это решение работает только для CPython.