возможности быстрого динамического выполнения кода в Python


У меня есть некоторый код, доступный в некоторой форме AST, и я хотел бы его выполнить.

Я могу придумать несколько способов сделать это, например:

  • просто передн интерпретировать его.
  • перевести его в Python AST (модуль ast) и
    • Python - compile это или
    • Python - eval это.
  • перевести его в исходный код Python (например, чистую строку) и
    • Python - compile это или
    • Python - eval тот.
  • переведите его в какую-нибудь форму низкоуровневого кода и напишите простую виртуальную машину на Python, которая его запускает.

Я думаю, что я бы получил ускоренное выполнение, переведя его в Python AST, compile и запустив это. Исп.. при использовании данных, я мог бы даже сделать улучшений PyPys оптимизаций JIT-компиляцию (я надеюсь, что я делаю, делать я?).

Можете ли вы подумать о других возможностях? Можете ли вы дать рекомендации о том, что может быть лучшим способом?
2 5

2 ответа:

Еще одна возможность: перевести AST непосредственно в байтовый код Python и выполнить его. Это похоже на вашу последнюю идею, за исключением использования существующей виртуальной машины Python.

Это не отличная возможность, потому что это может быть много работы, и Python compile, вероятно, сделает лучшую работу, за исключением довольно специфических случаев, но я просто выбрасываю ее.

Другая возможность: перевести в кодCython , записать в файл, скомпилировать с помощью Cython, затем компилятор C с включенной оптимизацией, загрузить полученный модуль и выполнить его.

Если код содержит аннотации типов, которые могут быть переведены в типы Cython/C, это может быть очень быстро. Однако будьте осторожны, поскольку Cython находится в бета-состоянии и все еще немного груб по краям. Кроме того, это решение работает только для CPython.