我正在编写一些代码,这些代码使用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
。但是,如果确实可以,我似乎还无法弄清楚如何使其与autowrap
一起使用。
如果我尝试这样做
>>> 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
对我来说,直接在autowrap
内部使用CodeBlock并不是正确的方法。 (我在使用Fortran后端时遇到类似的错误。)
问题是,有正确的方法吗?是否可以在CodeBlock
中使用autowrap
,还是可以通过其他方式使用autowrap
生成中间变量,而不是始终使我的sympy表达式完全展开?