передача массива numpy в функцию C из функции @njit

#python #arrays #c #numpy #numba

Вопрос:

Я искал решение для этого в последние дни, и, похоже, я не в состоянии его решить. У меня есть функция C, которая зацикливается на некоторых массивах. Функция вызывается из python, и массивы являются смежными массивами numpy, и все массивы выделяются со стороны python, функция C просто использует массивы и записывает в один выходной массив. Интерфейс, который я написал, работает просто отлично, но прямо сейчас мне нужно @njit функцию python, которая вызывается из других функций python, которые тоже будут jitted (я знаю, что jitting функции python, которая только почти вызывает функцию C, не ускорит, но более общие функции python проекта будут).

Я не могу заставить интерфейс с кодом C работать, когда я использую @njit. Я публикую здесь очень простой MWE с 2 массивами numpy. Функция C является:

 #include <stddef.h>
#include <sys/types.h>

void loopTestC(const size_t n, const double values[], double output[])
{

  size_t i;

  for (i=0; i<n; i  )
  {
      output[i] = values[i];
  }

}
 

которые я компилирую с

 gcc  -O0 -Wall -Wextra -pedantic -Warray-bounds  -fPIC -shared -o simpleLoopC.so simpleLoopC.c
 

в то время как код pyhon, который работает без @njit, является:

 #!/usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np
import ctypes
from numba import jit, njit

lib = ctypes.cdll.LoadLibrary('./simpleLoopC.so')
loop=lib.loopTestC

loop.restype = None

loop.argtypes = [ctypes.c_size_t,
        np.ctypeslib.ndpointer(ctypes.c_double, flags="C_CONTIGUOUS"),
        np.ctypeslib.ndpointer(ctypes.c_double, flags="C_CONTIGUOUS")]

# @njit(parallel=False)
def testC():
    a = np.arange(100, dtype=np.float64)
    b = np.zeros_like(a)

    print(a, b)
    n = a.size
    loop(n, a, b)
    print(a, b)

testC()
 

Когда я активирую numba, я получаю сообщение об ошибке >Неподдерживаемый тип ctypes: ><класс ‘numpy.ctypeslib.ndpointer_<f8_C_CONTIGUOUS’>. Я попробовал использовать ctypes, и похоже, что numba требует определения типов loop.argt, но я не могу заставить это работать. Кто-нибудь может мне помочь?

Спасибо.