用于 SciPy 集成和插值的 Numba

问题描述 投票:0回答:1

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

python scipy interpolation numba numerical-integration
1个回答
5
投票

刚刚为 cquadpack 编写了一个名为

NumbaQuadpack
的包装器,它应该可以执行您想要的操作:https://github.com/Nicholaswogan/NumbaQuadpack 。 cquadpack 是 Quadpack 的 C 版本,
scipy.integrate.quad
使用的就是它。

from NumbaQuadpack import quadpack_sig, dqags
import numpy as np
import numba as nb
import timeit

@nb.cfunc(quadpack_sig)
def f(x, data):
    return x**2 + 2 + np.log(x)
funcptr = f.address
a = 0
b = 1
sol, abserr, success = dqags(funcptr, a, b)
print(sol) # definite integral solution

# test speed
@nb.njit()
def timetest_nb():
    sol, abserr, success = dqags(funcptr, a, b)
timetest_nb()
n_time=10000
print(timeit.Timer(timetest_nb).timeit(number=n_time)/n_time) 

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

对于插值,只需使用

np.interp
(一维插值)。它可以在 numba-jitted 函数中使用。

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

© www.soinside.com 2019 - 2024. All rights reserved.