据我了解,矢量化numpy函数比Python循环快,因为循环是在C或Fortran中完成的。我想知道这种情况在源代码中的什么地方发生。
例如,scipy.special.bdtr
二项式CDF函数接受类似数组的参数k,n,p
,并在参数可广播的情况下返回ndarray。该文档说scipy.special.bdtr
是Cephes数学函数库中一个例程的包装。在Github上浏览源代码,我发现一个scipy/special/cephes/bdtr.c
文件,其中包含例程的C代码。我认为这是相关C函数的前三行:
double bdtr(k,n,p)
int k,n;
双p;
似乎底层的C函数不能在数组上运行,并且我找不到该函数转换为可在数组上运行的Python函数的源代码。
答案 0 :(得分:2)
对于scipy.special
函数,C代码仅包含函数的“内核”,即,如何将函数应用于标量。然后将其中每一个都包装到带有自动生成的ufunc
代码的Cython中。为此,它使用C头文件(例如scipy/special/cephes.h
,Cython声明文件(例如scipy/special/_cephes.pxd
,文件scipy/special/functions.json
),其中要为scipy.special
生成的所有函数都是列出,最后是scipy/special/_generate_pyx.py
,这是实际产生Cython代码的地方。