gpt4 book ai didi

python - 从 sympy 表达式生成 python 代码?

转载 作者:太空狗 更新时间:2023-10-30 00:27:57 25 4
gpt4 key购买 nike

问题:给定一个 sympy 表达式,是否有一种简单的方法来生成 python 代码(最后我想要一个 .py 或者一个 .pyc 文件)?我想这段代码将包含一个函数,该函数提供任何必要的输入并返回表达式的值。

为什么

我发现自己经常需要生成 python 代码来计算一些难以推导的东西,例如令人讨厌的非线性函数的雅可比矩阵。

我可以使用 sympy 推导出我想要的非线性事物的表达式:非常好。然后我想要的是从生成的 sympy 表达式生成 python 代码,并将该 python 代码保存到它自己的模块中。我以前做过,但我必须:

  1. 调用 str(sympyResult)
  2. 用正则表达式做一些自定义的事情,让这个字符串看起来像有效的 python 代码
  3. 将这段python代码写入一个文件

我注意到 sympy 具有针对其他几种语言的代码生成功能,但 python 没有。有没有一种简单的方法可以从 sympy 中获取 python 代码?

我知道解决这个问题的几种可能但有问题的方法:

  1. 我知道我可以在 sympy 表达式上调用 evalf 并插入我想要的数字。这有几个不幸的副作用:

    • 依赖性:我的代码现在依赖于 sympy 来运行。这很糟糕。
    • 效率:现在每次我进行数值计算时都必须运行 sympy:即使我对表达式进行 pickle 和 unpickle,我仍然每次都需要 evalf
  2. 我还知道我可以生成 C 代码,然后使用大量工具(python/C api、cython、weave、swig 等)包装该代码。然而,这意味着我的代码现在取决于是否有合适的 C 编译器。

编辑:摘要似乎 sympy.python,或者可能只是 str(expression) 是什么(参见 smichr 的回答和 Oliver W. 的评论),它们适用于简单的标量表达式。

这对 Jacobian 之类的东西没有多大帮助,但似乎 sympy.printing.print_ccode 也会在矩阵上阻塞。我想可以处理将矩阵打印到另一种语言的代码必须假定目标语言支持矩阵,对于 python 来说,这可能意味着依赖于 numpy 之类的东西的存在。如果存在这种生成 numpy 代码的方法就好了,但似乎没有。

最佳答案

如果您不介意代码本身具有 SymPy 依赖项,更好的解决方案是在代码中生成 SymPy 表达式并使用 lambdify来评估它。这将比使用 evalf 快得多,特别是如果你使用 numpy。

您还可以在 sympy.printing.lambdarepr 中查看使用打印机直接,这就是 lambdify 用来将表达式转换为 lambda 函数的方法。

关于python - 从 sympy 表达式生成 python 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27304590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com