per*_*iae 8 python performance inline scipy
我可以从内联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()
Run Code Online (Sandbox Code Playgroud)
sam*_*ias 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'])
Run Code Online (Sandbox Code Playgroud)
输出:
90
Run Code Online (Sandbox Code Playgroud)