возможности быстрого выполнения динамического кода в Python - PullRequest
5 голосов
/ 08 июля 2011

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 08 июля 2011

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

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

0 голосов
/ 08 июля 2011

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

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

...