【问题标题】:Create usable python function from a c string (sympy use case)从 c 字符串创建可用的 python 函数(sympy 用例)
【发布时间】: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。
  • 如果对选项 2 有任何帮助,我写了 two modules 在后台执行此操作。所以这显然是可能的,并且有一些代码供您重用..
  • @Wrzlprmft 啊啊啊! - 所以我并不孤单。在 python 中工作并在 C 中进行数值评估的愿望并不疯狂。 jitcode 包似乎有能力执行选项 2。

标签: python c string sympy dynamically-generated


【解决方案1】:

使用lambdify,或者如果你想要一个快速函数(编译成C),使用ufuncifyufuncify 需要编译器。

例子:

f = lambdify(x, sqrt(x), 'numpy')

f = ufuncify(x, sqrt(x))

此外,无论哪种情况,为了提高性能,您都应该直接评估数组上的函数,例如f(numpy.linspace(.1, .9, 100))。避免手动循环遍历 NumPy 数组;那会扼杀你的表现。

【讨论】:

  • sympy 特定编译的好答案
猜你喜欢
  • 2011-04-16
  • 2022-01-24
  • 2017-10-26
  • 1970-01-01
  • 2023-04-09
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多