在带有 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 对其进行矢量化。