Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 优化Symphy生成的代码_Python_C_Optimization_Sympy - Fatal编程技术网

Python 优化Symphy生成的代码

Python 优化Symphy生成的代码,python,c,optimization,sympy,Python,C,Optimization,Sympy,使用Symphy查找导数(请参见此问题:),我得出以下代码: from sympy import * from sympy.physics.mechanics import * from sympy.printing import print_ccode from sympy.utilities.codegen import codegen x1, x2, x3 = symbols('x1 x2 x3') y1, y2, y3 = symbols('y1 y2 y3') z1, z2, z3

使用Symphy查找导数(请参见此问题:),我得出以下代码:

from sympy import *
from sympy.physics.mechanics import *
from sympy.printing import print_ccode
from sympy.utilities.codegen import codegen


x1, x2, x3 = symbols('x1 x2 x3')
y1, y2, y3 = symbols('y1 y2 y3')
z1, z2, z3 = symbols('z1 z2 z3')

u = ReferenceFrame('u')

u1=(u.x*x1 + u.y*y1 + u.z*z1)
u2=(u.x*x2 + u.y*y2 + u.z*z2)
u3=(u.x*x3 + u.y*y3 + u.z*z3)

s1=(u1-u2).normalize()
s2=(u2-u3).normalize()
v=cross(s1, s2)
f=dot(v,v)

df_dy2=diff(f, y2)


print_ccode(df_dy2, assign_to='df_dy2')


[(c_name, c_code), (h_name, c_header)] = codegen( ("df_dy2", df_dy2), "C", "test", header=False, empty=False)

print c_code
这就产生了这种美:

#include "test.h"
#include <math.h>
double df_dy2(double x1, double x2, double x3, double y1, double y2, double y3, double z1, double z2, double z3) {
   return ((x1 - x2)*(y2 - y3)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))) - (x2 - x3)*(y1 - y2)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))))*(2*(x1 - x2)*(y1 - y2)*(y2 - y3)/(pow(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2), 3.0L/2.0L)*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))) + 2*(x1 - x2)*(-y2 + y3)*(y2 - y3)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*pow(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2), 3.0L/2.0L)) + 2*(x1 - x2)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))) - 2*(x2 - x3)*pow(y1 - y2, 2)/(pow(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2), 3.0L/2.0L)*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))) - 2*(x2 - x3)*(y1 - y2)*(-y2 + y3)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*pow(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2), 3.0L/2.0L)) + 2*(x2 - x3)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2)))) + (-(x1 - x2)*(z2 - z3)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))) + (x2 - x3)*(z1 - z2)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))))*(-2*(x1 - x2)*(y1 - y2)*(z2 - z3)/(pow(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2), 3.0L/2.0L)*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))) - 2*(x1 - x2)*(-y2 + y3)*(z2 - z3)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*pow(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2), 3.0L/2.0L)) + 2*(x2 - x3)*(y1 - y2)*(z1 - z2)/(pow(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2), 3.0L/2.0L)*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))) + 2*(x2 - x3)*(-y2 + y3)*(z1 - z2)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*pow(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2), 3.0L/2.0L))) + ((y1 - y2)*(z2 - z3)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))) - (y2 - y3)*(z1 - z2)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))))*(2*pow(y1 - y2, 2)*(z2 - z3)/(pow(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2), 3.0L/2.0L)*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))) + 2*(y1 - y2)*(-y2 + y3)*(z2 - z3)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*pow(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2), 3.0L/2.0L)) - 2*(y1 - y2)*(y2 - y3)*(z1 - z2)/(pow(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2), 3.0L/2.0L)*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))) - 2*(-y2 + y3)*(y2 - y3)*(z1 - z2)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*pow(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2), 3.0L/2.0L)) - 2*(z1 - z2)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))) - 2*(z2 - z3)/(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2))*sqrt(pow(x2 - x3, 2) + pow(y2 - y3, 2) + pow(z2 - z3, 2))));
}
#包括“test.h”
#包括
双df_dy2(双x1、双x2、双x3、双y1、双y2、双y3、双z1、双z2、双z3){
返回(x1-x2-x x x x x 1-x x x x x 1-x22,2-y2-y2,2)+战俘(z1-z2-z2-z2,2,2)2))*返回(x1-x x x x-x x x x 2-x x x 3-x x 2,2)(y2-y2-y2-y2-y2)(2-y2-y2-y3)(2-y2-y2-y2-y2-y3)(y2-y2-y2-y2-y2-y3)(y2-y2-y2-y3-y3-y3-y3)/////(sqrt)/(sqrt(sqrt)/(sqrt)/(sqrt(po(pow(pow(pow(pow(1-y1-y1-y1-y1-y1-y1-y2-y2-y2-y2-y)*(y2-y3)/(pow(pow(x1-x2,2)+pow(y1-y2-y2,2)(y1-y2-y2,2)(y2-y2-y2-y2-y2-y2,2)(y2-y2-y2-y3,2)(2)(y2-y2-y2-y2,2)(2)+pow(z1-z2-2,2,2,2),2(y2-y2-y1-y1-y2),2(z1-z2-z2-y2-2-y2-y2,2),2)+(y2(y2-y2-y2-y2-y2-y2,2)(2)(2)(2)(2)(2)(2)(2)(2)(2-y2-y2-y2)(2)(2-y2)(2)(2-y2-y2)(2-y2)(2-y2+3)(2)(2-y2)(2)(2)(2-y2-y2-y2)(3)(2 x2,2)+功率(y1-y2,2)+功率(z1-z2,2))*sqrt(功率(x2-x3-x3-x3-x3,2)(2)2)(2)(x2-x3-x3-x3-x3-2,2)(x2-x3-y2,2)/(pow(pow(x1-x3-x22,2)(2)(pow(x1-x3-x3-x3,2)2)+(pow(pow(x1-x3-x3,2,2)(x1-x2-x2,2)(x,2)(2)(pow(x1-x2-x2,2,2)(1-x2,2)(1-x,2)(1-x,2)(1-x,2)(1-x,2)(1-x,2)(1-x22)(1-x22)(2)(1-x,2)(1-x22)(2)(1-x,2)(1-x,2)(2)(1-x22)(2)(2)(2)(2)(2)(2))+(z2,2))战力(战力(x2-x3,2),战力(y2-y3,2),战力(2-2-z2-z3-z3-z3,2,2),3.0升/2.0升/2(2-2-z2-z3-z3-z2,2),3.0升/2.0升/2(2-z2-z3-z3,2,2),3.0升/2(2.0-2-3)(2-x3-x3-x3)及(sqrt(pow(pow(pow(1-x2-x2-x2-2-2-2,2,2-x2-2,2,2)2)及2)+)及pow(1-1-2-2-2-2-2-2-2-2-2-2-2-2-2-2,2-2,2-2-2,2-2-2)、2-2-2-2)及pow(z2)及(z2-2-2)(2)(2)(2)(2)(2)((x2-x3)*(z1-z2)/(sqrt(pow)(x1-x2,2)(2)(2)(2)(2)(2)(2)(y1-y2-y2,2)(2)(2)(2)(2)(y2-y3-y3,2)(2)(y2-y3-y3,2)(2)(2)(z2-z3-z3,2)(2)(2)(2)(1-y2,2)(2)(2)(2)(2)(2)(1-y2)(2-y2)(2)(2-y2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)(2)()/(sqrt(pow(x1-x2,2)+pow(y1-y2,2)+pow(z1-z2-2,2)(z1-z2-z2,2)(2)(z1-z2-z2-z3,2),3.0升/2.0升(z2-z3-z2,2.1-z2-z2,2)(2)(2)(2)(2)(z1-z2-z2,2)(2)(z1-z2-z1-z2,2)(2)(2-z1-z2-z1-z3-z3-z3-3,2.1-2,2,2,2.0升/2.0升)、3.0升/2.0升)、3.0升/2.0升)及2(2*(2(2)(2)(2)(2)(2-1-1-1-1-1-1-1-0升/2)(2)(2)(2)(2)(2)(2)(2-z1-1-1-1-1-1-1-1-1-1-1功率(x1-x2,2)+功率(y1-y2,2)+功率(z1-z2,2))*pow(功率(2)3.0升/2.0升(2.1-y2-y2-x3-x3-x3,2),3.0升/2.0升)))++(((1-y1-y2-y2-y2-z2-x3-3-2-z3-2-3-2-2-2-2-z3-2-z3-2-z2-z2-z2-z3-z3)/(sqrt(上述上述2-z2-z2-z2-z2-z2-z2-3-3)//(sqrt(上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述上述两个)及,(,(,(,(,(,(,(2-z2-z2-z2-z2-z2-z2-z2-z2-3-z3-z3-z3-z3-3-3-3-3-3 x3,2)+功率(y2-y3,2)+功率(z2-z3,2)))*(2)z2-z2-z2-2,2)*(z2-z2-z3)/(pow(pow(pow)(pow(1-x2-2,2-y2-2,2)2)+pow(z1-2-z2,2,2),3.0升/2.0升/2.1-2-2-2(pow(pow(pow(pow(pow(pow(1-1-1-2-2-2-2-2-2-2-2-2-2,2-2-2-2,2-2,2-2-2,2,2-2-2-2-2)2-2-2)2-2)2)2-z3,2-z2)2)2)2)2)*(pow)(2)////(pow(pow(pow(pow(pow(pow(pow(pow(pow(pow(pow功率(z2-z3,2),3.0L/2.0L))-2*(y1-y2)*(y2-y3)*(z1-z2-z1-z2-z1-z1-z2-z1-z2-2,2.1-z1-z2-2,2.0升/2.0升(z1-z2-z2-z2-z2)(z1-z2-z1-z2)(z1-z1-x2-2,2.1-z1-z2,2)、2.0升/2.0-2.0升/2.0-z2.0升)(2.2)(2.2.1-z2-z2-z2)(2-z1-z1-z1-z2)、3)(2-1-2.0-2)、3)(2-2-2-1-z1-z2、3)、3-2)(3)(3-2)(3)(3-z1-z2)(2-2)(2)(2)(z2-z2)(2-2)(z2)(z2)(2)(z2)(2)(2 l/2.0L))-2*(z1-z2)/(sqrt(功率(x1-x2,2)+pow(y1-y2,2)+pow(z1-z2,2))*sqrt(pow(x2-x3,2)+pow(y2-y3,2)+pow(z2-z3,2))-2*(z2-z3)/(sqrt(pow(x1-x2,2)+pow(y1-y2,2)+pow(z1-z2,2))*sqrt(pow(x2-x3,2)+pow(y2-z3,2));
}
相同数字的SQRT和POW多次出现,可以一次计算以提高可读性和执行时间。但我不知道如何

问题1:你知道一种让sympy自动完成的方法吗

问题2:您知道使用其他工具对代码进行后处理的方法吗


问题3:gcc可以在编译时优化它吗?为什么?

gcc可能会优化它,但如果您想自己做,请查看
cse
以下是我自己的小脚本,它基于asmeurers提示:

def sympyToC( symname, symfunc ):
    tmpsyms = numbered_symbols("tmp")
    symbols, simple = cse(symfunc, symbols=tmpsyms)
    symbolslist = map(lambda x:str(x), list(symfunc.atoms(Symbol)) )
    symbolslist.sort()
    varstring=",".join( " double "+x for x in symbolslist )

    c_code = "double "+str(symname)+"("+varstring+" )\n"
    c_code +=  "{\n"
    for s in symbols:
        #print s
        c_code +=  "  double " +ccode(s[0]) + " = " + ccode(s[1]) + ";\n"
    c_code +=  "  r = " + ccode(simple[0])+";\n"
    c_code +=  "  return r;\n"
    c_code += "}\n"
    return c_code
对于python3.5+:

def sympyToC( symname, symfunc ):
    tmpsyms = numbered_symbols("tmp")
    symbols, simple = cse(symfunc, symbols=tmpsyms)
    symbolslist = sorted(map(lambda x:str(x), list(symfunc.atoms(Symbol))))
    varstring=",".join( " double "+x for x in symbolslist )
    c_code = "double "+str(symname)+"("+varstring+" )\n"
    c_code +=  "{\n"
    for s in symbols:
        #print s
        c_code +=  "  double " +ccode(s[0]) + " = " + ccode(s[1]) + ";\n"
    c_code +=  "  r = " + ccode(simple[0])+";\n"
    c_code +=  "  return r;\n"
    c_code += "}\n"
    return c_code

谢谢!几乎正是我所需要的。将cse的结果转换为单个c函数仍然是一个问题,你知道这是如何做到的吗?因为我无法说服codegen这样做,所以我写了一个小脚本,看看我自己的答案。