Skip to content

Instantly share code, notes, and snippets.

@u0078867
Last active November 22, 2016 12:43
Show Gist options
  • Save u0078867/a5400ab50c0a71cbbca32981cc965d3d to your computer and use it in GitHub Desktop.
Save u0078867/a5400ab50c0a71cbbca32981cc965d3d to your computer and use it in GitHub Desktop.
Python converters from SymPy math expression to C code optimized for speed (SymPy CSE, GCC -Ofast)
from sympy import Symbol cse, ccode
from sympy.utilities import numbered_symbols
# Inspired by http://stackoverflow.com/questions/22665990/optimize-code-generated-by-sympy
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 )[1:]
c_code = "\n// Needed GCC 4.7+\n\n"
c_code += "#pragma GCC push_options\n"
c_code += "#pragma GCC optimize (\"Ofast\")\n\n"
c_code += "#include \"" + symname + ".h\"\n"
c_code += "#include <math.h>\n\n"
c_code += "double "+str(symname)+"("+varstring+") {\n"
for s in symbols:
c_code += " double " +ccode(s[0]) + " = " + ccode(s[1]) + ";\n"
c_code += " double r;\n"
c_code += " r = " + ccode(simple[0])+";\n"
c_code += " return r;\n"
c_code += "}\n\n"
c_code += "#pragma GCC pop_options\n"
return c_code
def sympyToH(symname, symfunc):
h_code = "\n"
h_code += "#ifndef PROJECT__" + symname.upper() + "__H\n"
h_code += "#define PROJECT__" + symname.upper() + "__H\n"
h_code += "#ifdef __cplusplus\n"
h_code += "extern \"C\" {\n"
h_code += "#endif\n"
symbolslist = map(lambda x:str(x), list(symfunc.atoms(Symbol)) )
symbolslist.sort()
varstring=",".join( " double "+x for x in symbolslist )[1:]
h_code += "double "+str(symname)+"("+varstring+");\n"
h_code += "#ifdef __cplusplus\n"
h_code += "}\n"
h_code += "#endif\n"
h_code += "#endif\n"
return h_code
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment