2016-09-28 3 views
0

Мне нужно использовать функции ctypes, чтобы сократить время работы quad в python. Вот мой оригинальный вопрос original question, но теперь я знаю, какой путь мне нужно следовать. Мне нужно выполнить те же шаги, что и здесь similar problem link.Оптимизация python quad с использованием ctypes

Однако в моем случае функция, которая будет обрабатываться в числовом интеграле, вызывает другую функцию python. Как это:

from sklearn.neighbors import KernelDensity 
import numpy as np 

funcA = lambda x: np.exp(kde_bad.score_samples([[x]])) 
quad(funcA, 0, cut_off) 

где cut_off просто скаляр, я решу в моем коде, и kde_bad является объектом ядра создается с помощью KernelDensity.

Так что мой вопрос в том, как мне нужно указать функцию в C? эквивалент этого:

//testlib.c 

double f(int n, double args[n])  
{ 
    return args[0] - args[1] * args[2]; //corresponds to x0 - x1 * x2 
} 

Любой вход оценивается!

ответ

0

You can do this using ctypes's callback function facilities.

Тем не менее, это спорно, будете ли или не вы на самом деле достичь какого-либо преимущества скорости, если ваша функция вызывает что-то из Python. Существуют две причины, по которым ctypes ускоряет интеграцию: (1) функция подынтегральной функции выполняется быстрее, чем скомпилированный C, чем байт-код Python, и (2) он избегает вызова на Python из скомпилированных (Fortran!) Подпрограмм QUADPACK. То, что вы предлагаете, полностью исключает второй из этих источников повышения производительности, и может даже увеличить штраф, если вы делаете такой вызов более одного раза. Если, однако, большая часть времени выполнения вашего подынтегрального выражения находится в его собственном коде, а не в других функциях Python, которые вам нужно вызвать, тогда вы можете увидеть некоторые преимущества.

Смежные вопросы