Вызов функций Python из встроенного C с scipy.weave - PullRequest
8 голосов
/ 08 мая 2011

Могу ли я вызвать функцию Python из встроенного кода C (используя 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 голосов
/ 08 мая 2011

Это немного сложнее, поскольку у 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
...