Я разрабатываю аудио-алгоритм с использованием 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];
}
}
Теперь я хочу создать два массива numpy и обработать их этой функцией. Я понял способ сделать это:
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]
не работает. Почему бы и нет?