Sto sviluppando un algoritmo audio usando Python e Numpy. Ora voglio accelerare tale algoritmo implementando una parte di esso in C. In passato, I have done this using cython. Ora voglio fare la stessa cosa usando il nuovo cffi.Come passare un array Numpy in una funzione cffi e come recuperarne uno?
A scopo di verifica, ho scritto una funzione C banale:
void copy(float *in, float *out, int len) {
for (int i=0; i<len; i++) {
out[i] = in[i];
}
}
Ora voglio creare due array NumPy ed avere quelli essere effettuati anche da questa funzione. Ho trovato un modo per farlo:
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)
Tuttavia, vorrei migliorare questo codice:
- c'è un modo per accedere direttamente i buffer galleggiante sottostanti degli array numpy senza copiare loro?
ffi.buffer
è molto conveniente per la conversione rapida di contenuti di un array C in un array Numpy. Esiste un modo equivalente per convertire rapidamente un array numerico in un array C senza copiare i singoli elementi?- Per alcune applicazioni,
float_in[0:16] = arr_in[0:16]
è un modo conveniente per accedere ai dati. L'opposto,arr_out[0:16] = float_out[0:16]
, tuttavia, non funziona. Perchè no?
+1 per citare passi – Matthias