使用ctypes优化python quad

时间:2016-09-28 09:12:44

标签: python ctypes numerical-integration quad

我需要使用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
}

感谢任何输入!

2 个答案:

答案 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在这里利用其矢量化计算功能来挽救一天。