#python #fortran #numba #f2py
Вопрос:
Я пытаюсь использовать скомпилированную функцию f2py в функцию python, украшенную декоратором @njit из numba. Сигнатура функции, завернутой в f2py, является:
stp,f,g,task = xxx(stp,f,g,ftol,gtol,xtol,task,stpmin,stpmax,isave,dsave)
Wrapper for ``xxx``.
Parameters
----------
stp : input float
f : input float
g : input float
ftol : input float
gtol : input float
xtol : input float
task : input string(len=60)
stpmin : input float
stpmax : input float
isave : in/output rank-1 array('i') with bounds (2)
dsave : in/output rank-1 array('d') with bounds (13)
Returns
-------
stp : float
f : float
g : float
task : string(len=60)
и файл подписи включает в себя:
subroutine xxx(stp,f,g,ftol,gtol,xtol,task,stpmin,stpmax,isave,dsave)
double precision, intent(in,out) :: stp
double precision, intent(in,out) :: f
double precision, intent(in,out) :: g
double precision, intent(in) :: ftol
double precision, intent(in) :: gtol
double precision, intent(in) :: xtol
character*60, intent(in, out) :: task
double precision, intent(in) :: stpmin
double precision, intent(in) :: stpmax
integer dimension(2), intent(inout) :: isave
double precision dimension(13), intent(inout) :: dsave
end subroutine xxx
Поскольку в режиме «nopython» numba должен знать сигнатуру внешней функции, мой текущий подход заключается в прямой загрузке xxx.so файл, созданный f2py с типами ctypes, вместо стандартного подхода «импорт». Затем я регистрирую входные и выходные аргументы функции с помощью типов ctypes следующим образом:
lib = ctypes.cdll.LoadLibrary('xxx.so')
lib.dcsrch_.argtypes = [ctypes.c_double, ctypes.c_double, ctypes.c_double,
ctypes.c_double, ctypes.c_double, ctypes.c_double,
ctypes.c_char_p(???), ctypes.c_double, ctypes.c_double,
np.ctypeslib.ndpointer(dtype=np.intc, ndim=1, shape=2),
np.ctypeslib.ndpointer(dtype=np.double, ndim=1, shape=13)]
lib.dcsrch_.restype = ctypes.py_object(???).
Здесь (???) указывает на то, что я особенно не уверен в подписи. Когда я пытаюсь использовать функцию, я всегда получаю seg. ошибки неисправностей. В то же время при импорте функции стандартным способом, т. е. из xxx import xxx, все проходит гладко.
Я был бы очень признателен за некоторую помощь здесь. Спасибо!
Ответ №1:
Я думаю, что вы могли бы найти ответы в спецификации аргументов __doc__
, сделав что-то вроде
from xxx import xxx
print(xxx.__doc__)
# or
print(xxx.function_name.__doc__)