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

8 投票
1 回答
3401 浏览
提问于 2025-04-16 17:14

我可以在内联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

撰写回答