sympy CSE:避免 pow/powf

2024-01-12

当 Sympy 生成 C 代码时, 有没有办法对表达式中的 pow(或 powf)出现强制执行 CSE 优化?

例如,这段代码片段

c, s = symbols('c s')
myexpr = c**6/1800 - c**5/100 - 0.00833333333333333*c**4*s**2 + 19*c**4/200 + 0.1*c**3*s**2 - 9*c**3/20 + c**2*s**4/120 - 0.57*c**2*s**2 + 43*c**2/40 - c*s**4/20 + 1.35*c*s**2 + 23*c/50 - 0.000555555555555556*s**6 + 19*s**4/200 - 1.075*s**2 - 2107/1800
import sympy
from sympy.codegen.ast import real, float64
sub_exprs,final_expr = sympy.cse([myexpr])
for var,expr in sub_exprs : print "const real", printing.ccode(expr, standard='C99', assign_to=var, type_aliases={real: float64})
print "return ",printing.ccode(final_expr[0], standard='C99', type_aliases={real: float64}),";"

产生以下令人失望的输出:

const real x0 = pow(c, 2); 
const real x1 = pow(c, 3); 
const real x2 = pow(c, 4); 
const real x3 = pow(s, 2); 
const real x4 = pow(s, 4); 

return (1.0/1800.0)*pow(c, 6) - 1.0/100.0*pow(c, 5) + 1.3500000000000001*c*x3 - 1.0/20.0*c*x4 + (23.0/50.0)*c - 0.00055555555555555599*pow(s, 6) - 0.56999999999999995*x0*x3 + (1.0/120.0)*x0*x4 + (43.0/40.0)*x0 + 0.10000000000000001*x1*x3 - 9.0/20.0*x1 - 0.0083333333333333297*x2*x3 + (19.0/200.0)*x2 - 1.075*x3 + (19.0/200.0)*x4 - 2107.0/1800.0 ;

Pow 优化已被完全忽略。

解决这个问题的方法是什么?

备注:我看到这个问题有部分提到here https://docs.sympy.org/latest/modules/codegen.html: “在许多情况下,代码打印机不会打印最佳代码。这方面的一个例子是 C 中的 powers。x**2 打印为 pow(x, 2) 而不是 x*x。应该进行其他优化(例如数学简化)在代码打印机之前。”


sympy 中的 CSE 例程并不完美(改进的 CSE 是listed https://github.com/sympy/sympy/wiki/GSoC-2018-Ideas作为需要改进的领域),例如:

>>> sympy.cse([x**4, x**3*y])
([], [x**4, x**3*y])

扩展pow在打印机中或在打印机安装之前讨论过 https://github.com/sympy/sympy/pull/14139有一段时间,现在有一个创建扩展pow https://docs.sympy.org/latest/modules/codegen.html#sympy.codegen.rewriting.create_expand_pow_optimization优化可以帮助一些人:

>>> expand_opt = create_expand_pow_optimization(3)
>>> expand_opt(x**5 + x**3)
x**5 + x*x*x

但请注意,如果您向它们传递正确的优化标志,大多数编译器将已经生成最佳汇编(无论源代码中的 CSE)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sympy CSE:避免 pow/powf 的相关文章

  • 在 Sympy.mpmath.plot 中更改图形大小

    我希望这个问题不是太初级 我已经广泛搜索了解决方案 但尚未找到 我最近开始使用 Jupyter Notebook 和 Sympy 在微积分 II 课上做笔记和做作业 这真是一个巨大的好处 然而 我唯一的问题是我无法弄清楚如何配置绘图的大小
  • 是否有一个完整的示例来将 sympy 中的数学表达式写入 Microsoft Word 文档?

    这可能是一个愚蠢的问题 但我很绝望 我是一名数学老师 我尝试生成数学测试 我为此尝试了 Python 并完成了一些工作 然而 我不是一个专业的程序员 所以我对 MathMl prettyprint 之类的东西迷失了方向 有谁可以为我提供一个
  • 使用 sympy 计算多元函数的泰勒级数

    我正在尝试使用 SymPy 计算依赖于三角函数的函数的泰勒级数sinc here http docs sympy org dev modules mpmath functions trigonometric html sinc functi
  • Sympy:指数相乘而不是总和指数相乘

    我正在搜索如何告诉 SymPy 使用指数乘法而不是总和的指数 也就是说 它当前给我 exp a b 我想要得到 exp a exp b 一定有一个相当简单的方法 但我似乎找不到 你可以使用expand http docs sympy org
  • 计算机代数软件,用于最小化一组多项式中的运算次数

    我有多项式系统 相当简单的多项式表达式 但相当长 优化我的手牌 表达式按集合分组 在给定的集合中 多个变量中有共同的术语 我想知道是否有一个计算机代数系统 例如 Mathematica Matlab 或 sympy 可以优化多个具有常用项的
  • 防止在 Sympy 中计算乘法表达式

    我正在生成一个包含两个分数的表达式 并且想用 LaTeX 漂亮地打印整个表达式 然后放在工作表上 例如 形式为 5 7 3 4 但是 当我执行以下操作时 fract1 sympy sympify Fraction 5 7 fract2 sy
  • 有没有办法在 SymPy 中处理常量函数参数?

    我正在生成符号函数并使用 SymPy 来简化它们 现在我想要一种方法来 简化 表示尚未拟合的函数中的常量参数的符号 例如 如果我生成一个多项式 我可能会生成一个像这样的字符串 C x x C x C x C SymPy 会变成 C x 2
  • 将 SymPy 矩阵转换为 numpy 数组/矩阵的最佳方法是什么

    我不确定我一直在使用的方法是否sympy转换一个MutableDenseMatrix to a numpy array or numpy matrix目前是一个很好的做法 我有一个符号矩阵 例如 g sympy Matrix x 2 x 3
  • 对角化符号矩阵

    我需要用 python 对角化一个符号矩阵 在 Mathematica 中这可以很容易地完成 但是当使用模块时numpy linalg我遇到问题 为了具体起见 请考虑矩阵 2 x x 3 where x是一个符号变量 我想我遇到了问题 因为
  • 使用 SymPy codegen 为方程组生成 Fortran 子例程

    以我发现的以前的例子为基础here https stackoverflow com questions 25327845 how to generate fortran subroutine with sympy codegen 我尝试找出
  • Python Sympy 求解返回列表与字典

    我正在使用 sympy 及其求解函数 但我注意到它有时返回列表中的字典 但在其他情况下仅返回字典 没有列表 from sympy import x y symbols x y q 16 x 0 5 y 0 5 solve diff q x
  • 如何为多个变量声明具有多个限制的 sympy Piecewise

    同情 我如何声明Piecewise子函数中多个变量具有多个限制的函数 这是我的背景和尝试 from sympy import Piecewise Symbol exp from sympy abc import z x1 Symbol x1
  • SymPy 的多彩图

    我试图在 SymPy 中绘制函数 x 2 的图 并希望用线 x 3 y 9 覆盖它 然后在某些点周围画一个圆 我已经用代码完成了上述所有操作 import sympy as sp x sp Symbol x first plot the f
  • 循环调用lambdaify,避免显式调用

    我有这个代码 var a b c arr np array 1 2 3 4 5 6 7 8 9 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 y np hsplit arr len var newdict for
  • python sympy计算余弦函数积分时出错

    因此 我直接尝试从 sympy 文档中获取示例 但出现了一个奇怪的错误 我正在使用 python 3 2 和 sympy 0 7 3 我一直在 ipython 笔记本上工作 尽管我认为这不会有什么不同 错误是 每当我创建 x 符号并尝试集成
  • 如何集成 sympy 表达式和 Latex 格式

    您好 提前感谢您的帮助 我正在尝试将数学格式与 sympy 表达式混合在一起 我正在使用 jupyter 笔记本 我可以在单独的行上获得乳胶和漂亮的 sympy 打印 但似乎无法找到一种方法将它们组合成一行 下面的代码打印三行 第三行应该是
  • sy.sympify(str(表达式)) 不等于表达式

    据我了解 str将 SymPy 表达式转换为字符串并sympify将字符串转换为 SymPy 表达式 因此 我希望以下内容成立 对于合理的表达 gt gt gt sy sympify str expr expr True 我尝试过这个 确实
  • Sympy:从表达式获取函数

    要从 sympy 表达式中获取所有变量 可以调用 free symbols在表达上 我想找回全部功能用在表达式中 例如 从y in from sympy import f Function f g Function g x Symbol x
  • 有意简化小数指数

    我有一个涉及分数指数的表达式 我想将其转换为可识别的多项式以求解 如果有必要 我可以使用写指数Rational但无法做到这一点 我能做些什么 gt gt gt from sympy import gt gt gt var d x d x g
  • 如何用 python 和 sympy 解决多元不等式?

    我对使用 python 和 Sympy 还很陌生 并且遇到了使用 sympy 解决多元不等式的问题 假设我的文件中有很多函数 如下所示 cst sqrt x 2 cst exp sqrt cst x 1 4 log log sqrt cst

随机推荐