Как передать массив Numpy в функцию cffi и как вернуть его обратно?

Я разрабатываю аудио алгоритм, используя Python и Numpy. Теперь я хочу ускорить этот алгоритм, реализовав его часть на C. В прошломЯ сделал это с помощью Cython, Теперь я хочу сделать то же самое, используя новыйcffi.

Для тестирования я написал тривиальную функцию C:

void copy(float *in, float *out, int len) {
    for (int i=0; i<len; i++) {
        out[i] = in[i];
    }
}

Теперь я хочу создать два пустых массива и обработать их этой функцией. Я нашел способ сделать это:

import numpy as np
from cffi import FFI

ffi = FFI()
ffi.cdef("void copy(float *in, float *out, int len);")
C = ffi.dlopen("/path/to/copy.dll")

float_in = ffi.new("float[16]")
float_out = ffi.new("float[16]")

arr_in = 42*np.ones(16, dtype=np.float32)

float_in[0:16] = arr_in[0:16]
C.copy(float_in, float_out, 16)
arr_out = np.frombuffer(ffi.buffer(float_out, 16*4), dtype=np.float32)

Тем не менее, я хотел бы улучшить этот код:

Есть ли способ получить прямой доступ к базовым плавающим буферам массивов numpy, не копируя их?ffi.buffer очень удобно для быстрого преобразования содержимого массива C в массив Numpy. Есть ли эквивалентный способ быстрого преобразования массива NumPy в массив C без копирования отдельных элементов?Для некоторых приложенийfloat_in[0:16] = arr_in[0:16] это удобный способ доступа к данным. Противоположный,arr_out[0:16] = float_out[0:16] не работает однако. Почему нет?

Ответы на вопрос(4)

Ваш ответ на вопрос