2014-12-04 6 views
3

Вопрос: Учитывая симплексное выражение, есть простой способ генерации кода python (в конце я хочу файл .py или, возможно, .pyc)? Я предполагаю, что этот код будет содержать функцию, которая получает любые необходимые входные данные и возвращает значение выражения.Создать код python из выражения sympy?

Почему

Я считаю себя довольно часто нуждаясь генерировать код питона, чтобы вычислить что-то противным, чтобы получить, например, матрицы Якоби неприятную нелинейной функции.

Я могу использовать sympy для выражения выражения для нелинейной вещи, которую хочу: очень хорошо. То, что я тогда хочу, состоит в том, чтобы сгенерировать код python из полученного выражения sympy и сохранить этот код python в его собственный модуль. Я сделал это раньше, но я должен был:

  1. вызовов ули (sympyResult)
  2. Do пользовательских вещей с регулярными выражениями, чтобы получить эту строку, чтобы выглядеть как действительный код питона
  3. писать этот питон код для файл

Я отмечаю, что у sympy есть возможности генерации кода для нескольких других языков, но не для python. Есть ли простой способ получить код python из sympy?

Я знаю, что из нескольких возможных, но проблемных способов обойти эту проблему:

  1. Я знаю, что я мог бы просто позвонить evalf на SymPy выражения и подключить цифры, которые я хочу. У этого есть несколько неблагоприятных побочных эффектов:

    • зависимость: мой код теперь зависит от того, как sympy запускается. Это плохо.
    • Эффективность: sympy теперь нужно запускать каждый раз, когда я численно оцениваю: даже если я мариную и разглажу выражение, мне все равно нужно evalf каждый раз.
  2. Я также знаю, что я мог бы генерировать, скажем, C код, а затем обернуть этот код, используя множество инструментов (питон/C API, Cython, переплетения, глотка, и т.д. ...). Это, однако, означает, что мой код теперь зависит от наличия соответствующего компилятора C.

Edit: Резюме кажется, что sympy.python, или, возможно, просто Обл (выражение) это то, что есть (см ответ от smichr и комментарий от Oliver W.), и они работают на простой скаляр выражения.

Это не очень помогает в таких вещах, как якобианцы, но тогда кажется, что sympy.printing.print_ccode также зажимает на матрицах. Я предполагаю, что код, который может обрабатывать печать матриц на другом языке, должен был бы предполагать поддержку матрицы на целевом языке, что для python, вероятно, означало бы опору на присутствие таких вещей, как numpy. Было бы неплохо, если бы такой способ генерации numpy-кода существовал, но, похоже, это не так.

+0

Зависит от типа функций, которые вы генерируете с помощью Sympy. Большинство функций имеют прямой эквивалент в стандартном модуле 'math', некоторые из них также представлены в' numpy' или 'scipy.special'. Если вы не хотите зависеть от Sympy, вам все равно придется копировать строковое представление в ваш фактический файл, подобно тому, как вы это делаете сейчас (строковое представление обычно является допустимым кодом python, математика импортируется). Вы можете автоматизировать это с помощью функции, которая записывает действительный файл python, который имеет эту функцию (sympy), но тогда это не будет очень общей экспортной функцией. –

ответ

4

Функция, которую вы ищете для генерации кода на Python, - python.Хотя он генерирует код python, этот код нуждается в некоторой настройке, чтобы удалить зависимость от объектов SymPy, как указал Оливер W.

>>> print python(Matrix([[x**2,exp(y) + x]]).jacobian([x, y])) 
x = Symbol('x') 
y = Symbol('y') 
e = MutableDenseMatrix([[2*x, 0], [1, exp(y)]]) 
3

Если вы не против того, зависимость SymPy в самом коде, лучшим решением является создание выражения SymPy в коде и использовать lambdify, чтобы оценить его. Это будет намного быстрее, чем использование evalf, особенно если вы используете numpy.

Вы также можете посмотреть, как использовать принтер в sympy.printing.lambdarepr, что и используется lambdify, чтобы преобразовать выражение в функцию лямбда.

Смежные вопросы