在带有 numba 的函数中调用 scipy.special 中的 Fortran 例程
Calling Fortran routines in scipy.special in a function jitted with numba
有没有一种方法可以直接或间接调用可以在此处找到的 Fortran 例程 https://github.com/scipy/scipy/tree/master/scipy/special/cdflib 以及 scipy.stats
从一个应该由 [=12 编译的函数中使用的例程=] 在 nopython
模式下?
具体来说,因为scipy.stats.norm.cdf()
有点慢,我现在直接用scipy.special.ndtr
,这是前者调用的。但是,我正在循环执行此操作,我的目的是使用 numba
.
加快速度
我会看一下 rvlib,它使用 Numba 和 CFFI 调用 RMath,它是 R 用来计算统计分布的独立 C 库。它提供的功能应该可以在 nopython
模式下由 Numba 调用。查看自述文件以获取等效于 scipy.stats.norm.cdf()
的函数示例
如果您仍然对自己包装 cdflib
感兴趣,我建议您使用 CFFI。你必须为你想要的功能构建一个 C 接口。您可能会发现我写的这篇博客 post 对入门很有帮助:
https://www.continuum.io/blog/developer-blog/calling-c-libraries-numba-using-cffi
如果您只需要普通的 CDF,那么您可以使用标准库的 math
模块中的 erfc
函数来实现它。
import numba
from math import erfc, sqrt
SQRT2 = sqrt(2.0)
@numba.jit(nopython=True)
def normcdf(x):
# If X ~ N(0,1), returns P(X < x).
return erfc(-x / SQRT2) / 2.0
您可以使用 numba.vectorize
而不是 numba.jit
对其进行矢量化。
有没有一种方法可以直接或间接调用可以在此处找到的 Fortran 例程 https://github.com/scipy/scipy/tree/master/scipy/special/cdflib 以及 scipy.stats
从一个应该由 [=12 编译的函数中使用的例程=] 在 nopython
模式下?
具体来说,因为scipy.stats.norm.cdf()
有点慢,我现在直接用scipy.special.ndtr
,这是前者调用的。但是,我正在循环执行此操作,我的目的是使用 numba
.
我会看一下 rvlib,它使用 Numba 和 CFFI 调用 RMath,它是 R 用来计算统计分布的独立 C 库。它提供的功能应该可以在 nopython
模式下由 Numba 调用。查看自述文件以获取等效于 scipy.stats.norm.cdf()
如果您仍然对自己包装 cdflib
感兴趣,我建议您使用 CFFI。你必须为你想要的功能构建一个 C 接口。您可能会发现我写的这篇博客 post 对入门很有帮助:
https://www.continuum.io/blog/developer-blog/calling-c-libraries-numba-using-cffi
如果您只需要普通的 CDF,那么您可以使用标准库的 math
模块中的 erfc
函数来实现它。
import numba
from math import erfc, sqrt
SQRT2 = sqrt(2.0)
@numba.jit(nopython=True)
def normcdf(x):
# If X ~ N(0,1), returns P(X < x).
return erfc(-x / SQRT2) / 2.0
您可以使用 numba.vectorize
而不是 numba.jit
对其进行矢量化。