用于 SciPy 集成和插值的 Numba

Onl*_*ers 1 python integration interpolation scipy numba

我使用 Numba 来加速我的代码。它效果很好,可提供 2-3 倍的改进。然而,我的代码中花费的主要时间(大约 90%)是在 scipy 四边形积分和插值(线性和三次样条)上。我进行了数百次这些集成,因此我认为这是 Numba 可以增强的功能。看起来 Numba 不支持这些?我听说过 Numba-Scipy ,它应该让 Numba 识别 Scipy,但这似乎仍然不起作用。有没有办法让 Numba 优化我的积分/插值?

nic*_*gan 5

刚刚编写了一个名为cquadpackNumbaQuadpack的包装器,它应该可以执行您想要的操作:https://github.com/Nicholaswogan/NumbaQuadpack。cquadpack是Quadpack的C版本,这就是scipy.integrate.quad使用的。

\n
from NumbaQuadpack import quadpack_sig, dqags\nimport numpy as np\nimport numba as nb\nimport timeit\n\n@nb.cfunc(quadpack_sig)\ndef f(x, data):\n    return x**2 + 2 + np.log(x)\nfuncptr = f.address\na = 0\nb = 1\nsol, abserr, success = dqags(funcptr, a, b)\nprint(sol) # definite integral solution\n\n# test speed\n@nb.njit()\ndef timetest_nb():\n    sol, abserr, success = dqags(funcptr, a, b)\ntimetest_nb()\nn_time=10000\nprint(timeit.Timer(timetest_nb).timeit(number=n_time)/n_time) \n
Run Code Online (Sandbox Code Playgroud)\n

在我的计算机上,这个小积分需要 4.2 \xc2\xb5s,当我使用 scipy.integrate.quad 执行相同的操作时,需要 68.1 \xc2\xb5s。

\n

对于插值,只需使用np.interp(1d 插值)。它可以在 numba-jitted 函数中使用。

\n

一般来说,任何 C/C++ 或 Fortran 代码都可以用 ctype 包装,并从 numba-jitted 函数中调用。

\n