【问题标题】:Calling Python functions from inline C with scipy.weave使用 scipy.weave 从内联 C 调用 Python 函数
【发布时间】:2011-05-08 19:02:16
【问题描述】:

我可以从内联 C 代码(使用 weave)调用 python 函数吗?

动机: 我有一些我想优化的代码,并且我已经确定了一个函数的瓶颈。在我惯用的技巧之后,我通常会转向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()

【问题讨论】:

  • 那是你真正的 foo 函数吗?
  • 不,这只是结构的一个例子。我实际的 foo 函数足够复杂,用 C 语言编写它也会很痛苦,尤其是因为它不是我的瓶颈。
  • foo 调用了什么,调用了多少次?

标签: python performance inline scipy


【解决方案1】:

这有点复杂,因为 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

【讨论】:

    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多