Как передать массив 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]
не работает однако. Почему нет?