我真的想使用Cymp和openmp来运行scipy.interpolation.RectBivariateSpline.ev
函数。样条曲线的评估函数现在是我要优化的代码中的最后一个瓶颈。
作为权宜之计,我正在使用Python的multiprocessing
软件包来评估大型坐标数据的可承受性......但是,由于多种原因,我们需要远离{{1包裹。
我在将Fortran multiprocessing
函数重构为C然后用Cython包装之前的最后一站是尝试使用openmp和Cython包装Scipy bisplev
函数。
正如我所料(但希望不是这种情况),scipy.interpolate._fitpack._bisplev
是一个Python对象而不是_bisplev
d,并且不能在Cython中使用cdef
调用。我看过但找不到nogil
的来源,但我现在想象它是某种Fortran-C-Python接口。 (这对我来说是一个多余的声明,因为我不知道究竟是什么)。
如果有人对我可以从这里开始的地方有任何建议......特别是在不使用Python _bisplev
的情况下并行化scipy.interpolation.RectBivariateSpline.ev
调用的最佳方法,我将非常感激。任何其他提示或推动正确的方向也将非常感激。
我第一次尝试为multiprocessing
制作(天真)Cython包装器,意图与openmp ::
interp2_fastev.pyx
bispev
我打算最终使用import numpy as np
cimport numpy as np
from scipy.interpolate._fitpack import _bispev
def ev(double[:] x, double[:] y, double[:] ty, int kx, int ky, double[:] tx, double[:] c):
cdef int ckx
cdef int cky
ckx = kx
cky = ky
with nogil:
_bispev(tx, ty, c, kx, ky, x, y, 0, 0)
循环,但如果我甚至无法使用prange
致电_bispev
,那么这不是一个选项。
答案 0 :(得分:1)
_fitpack
是一个已编译的文件(.so):/scipy/interpolate/_fitpack.cpython-35m-i386-linux-gnu.so
在github
上搜索我找到了
scipy/scipy/interpolate/src/_fitpackmodule.c
scipy/scipy/interpolate/src/__fitpack.h
第二个有
的定义static char doc_bispev[] = " [z,ier] = _bispev(tx,ty,c,kx,ky,x,y,nux,nuy)";
fitpack_bispev(PyObject *dummy, PyObject *args)
似乎负责内存分配并调用Fortran:
BISPEV(tx, &nx, ty, &ny, c, &kx, &ky, x, &mx, y, &my, z, wrk, &lwrk,
iwrk, &kwrk, &ier);
使用fortran代码:
scipy/scipy/interpolate/src/fitpack.pyf