使用scipy.weave从内联C调用Python函数

时间:2011-05-08 19:02:17

标签: 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()

1 个答案:

答案 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