微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于 SciPy 积分和插值的 Numba

如何解决用于 SciPy 积分和插值的 Numba

我使用 Numba 来加速我的代码。它工作得很好,并提供了 2-3 倍的改进。然而,在我的代码中花费的主要时间(大约 90%)是在 scipy 四边形积分和插值(线性和三次样条)中。我做了数百次这些集成,所以我认为这是 Numba 可以提升的东西。 Numba 好像不支持这些?我听说 Numba-Scipy 可以让 Numba 识别 Scipy,但这似乎仍然不起作用。 有没有办法让 Numba 优化我的集成/插值?

解决方法

刚刚为 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,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 函数中调用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。