我需要使用ctypes函数来减少python中quad的运行时间。这是我原来的问题original question,但现在我知道我需要遵循的路径。我需要按照similar problem link中的步骤进行操作。
但是在我的情况下,将在数值集成中处理的函数是调用另一个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 :(得分:0)
You can do this using ctypes's callback function facilities.
也就是说,如果你的函数从Python调用某些东西,你是否真的会实现任何速度提升是有争议的。 ctypes加速集成的原因主要有两个:(1)集成函数本身比编译C更快,而不是Python字节码;(2)它避免了从编译的(Fortran!)QUADPACK例程回调Python。你提出的建议完全消除了这些性能提升的第二个来源,如果你多次拨打这样的电话,甚至可能会增加惩罚。但是,如果你的被积函数的大部分执行时间都在你自己的代码中,而不是你需要调用的其他Python函数中,那么你可能会看到一些好处。
答案 1 :(得分:0)
the other question中的回答是,quadpy在这里利用其矢量化计算功能来挽救一天。