【发布时间】:2017-07-14 14:19:00
【问题描述】:
我有一些从某处即时生成的 c 代码(在我的例子中是 sympy.printing.ccode),它看起来像这样:
c_code = "1.17647058823529*(-1.0L/3.0L*pow(-pow(x, 2) + 1, 1.0L/3.0L) + 1)*exp(4.70588235294118*I*M_PI*x)/sqrt(-pow(x, 2) + 1)"
在 python 中我如何定义 f(x) 以便我可以做到:
#TODO: f = SOMETHING(c_code)
for x in numpy.linspace(.1, .9, 100)
some_value = f(x)
print some_value
我知道我总是可以在函数中 eval() 一串 python 代码。是否有一些优雅的方法可以在函数中“evalc()”一串 c 代码?
(ps 1 - 我知道我可以直接从 sympy 进行 evalf() 或 lambdify() 并避免这种情况,但这非常慢,并且对于必须在大型域上评估的多变量函数来说确实崩溃了)
(ps 2 - 我知道我可以将字符串修改为可编译 python 模块的源,然后将字符串写入文件,然后在该文件上执行 ('command line c compile'),然后导入来自python的c模块,然后运行该函数-但这似乎是一个愚蠢的长链脆弱步骤,只是将字符串转换为可运行的c,特别是如果我可以信任源代码,因为它来自我喜欢的包)
【问题讨论】:
-
ps 2 对我来说似乎是最合乎逻辑的选择,如果你在做 C 工作,C 会被编译成二进制,除此之外的任何东西本质上都会很麻烦。否则,我会说您切换到可以即时解释的语言,例如 lua、lisp、erlang、javascript 甚至 python。
-
@Wrzlprmft 啊啊啊! - 所以我并不孤单。在 python 中工作并在 C 中进行数值评估的愿望并不疯狂。
jitcode包似乎有能力执行选项 2。
标签: python c string sympy dynamically-generated