使用scipy.weave在内联C中调用Python函数
我可以在内联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()
1 个回答
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