0

我需要使用 ctypes 函数来减少 python 中 quad 的运行时间。这是我最初的问题original question,但现在我知道我需要遵循什么路径。我需要按照与此处类似问题链接中相同的步骤进行操作。

但是,在我的情况下,将在数值积分中处理的函数是调用另一个 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
}

任何输入表示赞赏!

4

2 回答 2

0

您可以使用 ctypes 的回调函数工具来执行此操作。

也就是说,如果你的函数从 Python 调用某些东西,你是否真的能获得任何速度提升是有争议的。ctypes 加速集成的原因主要有两个:(1) 被积函数本身作为编译的 C 比作为 Python 字节码更快,以及 (2) 它避免从已编译的 (Fortran!) QUADPACK 例程回调到 Python。您提出的建议完全消除了这些性能提升的第二个来源,如果您不止一次进行这样的调用,甚至可能会增加惩罚。但是,如果您的被积函数的大部分执行时间在它自己的代码中,而不是在您需要调用的这些其他 Python 函数中,那么您可能会看到一些好处。

于 2017-03-08T01:57:24.937 回答
0

正如在另一个问题中所回答的那样,quadpy以其矢量化计算能力来拯救这一天。

于 2019-11-03T19:06:15.283 回答