我正在编写一些代码,使用sympy构造一个复杂的数学表达式,然后使用
autowrap
函数来编译它并重复计算它。
不幸的是,我的表达式在某些情况下正变得指数级大。为了防止这种情况,我想生成包含赋值语句的表达式。也就是说,我想以类似(伪代码)的方式结束
x1 = f(a,a);
x2 = f(x1,x1);
x3 = f(x2,x2);
x4 = f(x3,x3);
而不是
f(f(f(a,a),f(a,a)),f(f(a,a),f(a,a))),f(f(a,a),f(a,a)),f(f(a,a),f(a,a))))
其中每个子表达式都被替换了两次。
似乎有一种机制,以
sympy.codegen.ast.CodeBlock
是的。然而,我似乎不知道如何让这个工作
自动换行
,如果确实可以的话。
如果我想这么做
>>> f = autowrap(ast.CodeBlock(ast.Assignment(y,sym.sin(x))),backend='cython')
然后我得到一个很长的堆栈跟踪
wrapped_code_12.c:5:22: error: use of undeclared identifier 'y'
autofunc_result = y = sin(x);
^
1 error generated.
error: command '/usr/bin/clang' failed with exit status 1
我觉得直接在里面使用代码块
自动换行
不是正确的方法。(我在使用Fortran后端时也遇到了类似的错误。)
问题是,有没有正确的方法?我能用一下吗
CodeBlock
在里面
自动换行
,或者有其他方法可以生成中间变量
自动换行
而不是总是让我的同情表达完全展开?