我需要使用ctypes函数来减少python中quad的运行时间。这是我最初的问题,最初的问题,但现在我知道我需要走哪条路。我需要按照同样的步骤在这里类似的问题链接。
然而,在我的情况下,将在数值积分中处理的函数是调用另一个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
}
任何输入都是赞赏的!
您可以使用ctypes的回调函数设施来完成此操作。
也就是说,如果你的函数从Python调用一些东西,你是否真的能获得任何速度提升是有争议的。ctypes加速集成主要有两个原因:(1)integrand函数本身在编译后的C中比在Python字节码中更快,(2)它避免了从编译后的(Fortran!)回调Python。QUADPACK例程。您所建议的完全消除了性能提升的第二个来源,如果您多次调用这样的调用,甚至可能会增加惩罚。但是,如果integrand的大部分执行时间是在它自己的代码中,而不是在您需要调用的其他Python函数中,那么您可能会看到一些好处。
正如在另一个问题中所回答的那样,quadpy在这里用它的矢量化计算能力来拯救世界。