我可以从内联C代码调用python函数(使用weave)吗?
动机: 我有一些我想要优化的代码,并且我已经确定了一个函数的瓶颈。在我常用的技巧之后,我通常会转向scipy.weave.inline进行优化。不幸的是,在这种情况下,我的函数在内部循环中调用另一个python函数。我已经确定内部函数没有引起速度问题,我真的不想在C中写它。
最小例子:
from weave import inline
def foo(x):
return x*2
def bar():
a = 0
for i in xrange(10):
a += foo(i)
return a
def bar_weave():
code = """
int a = 0;
for (int i=0;i<10;++i){
a += foo(i); //<<-- what I'd like to do, but doesn't work
}
return_val = a;"""
return inline(code,['foo'])
print bar()
print bar_weave()
答案 0 :(得分:11)
它有点牵扯,因为Weave没有办法自动编组参数并返回值。你需要做更多的工作:
def bar_weave():
code = """
int a = 0;
for (int i=0;i<10;++i){
py::tuple arg(1);
arg[0] = i;
a += (int) foo.call(arg);
}
return_val = a;
"""
return inline(code,['foo'])
输出:
90