Opracowuję algorytm audio za pomocą Pythona i Numpy. Teraz chcę przyspieszyć ten algorytm, wprowadzając jego część w C. W przeszłości, I have done this using cython. Teraz chcę zrobić to samo, używając nowego cffi.Jak przekazać tablicę Numpy do funkcji cffi i jak ją odzyskać?
Dla celów testowych napisałem trywialny C funkcję:
void copy(float *in, float *out, int len) {
for (int i=0; i<len; i++) {
out[i] = in[i];
}
}
Teraz chcę utworzyć dwa numpy tablice i mają te są przetwarzane przez tę funkcję. ja wymyśliliśmy sposób, aby to zrobić:
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)
Jednak chciałbym, aby poprawić ten kod:
- Czy istnieje sposób, aby uzyskać bezpośredni dostęp do podstawowych buforów obrocie tablic numpy bez kopiowania im?
ffi.buffer
jest bardzo wygodny do szybkiego przekształcenia zawartości tablicy C w tablicę Numpy. Czy istnieje równoważny sposób szybkiego przekształcenia tablicy numpy w tablicę C bez kopiowania poszczególnych elementów?- Dla niektórych aplikacji wygodnym sposobem uzyskania dostępu do danych jest
float_in[0:16] = arr_in[0:16]
. Przeciwnie,arr_out[0:16] = float_out[0:16]
nie działa jednak. Dlaczego nie?
+1 dla wspomnieć postępy – Matthias