Python ve Numpy kullanarak bir ses algoritması geliştiriyorum. Şimdi bu algoritmayı C'nin bir parçasını uygulayarak hızlandırmak istiyorum. Geçmişte, I have done this using cython. Şimdi aynı şeyi yeni cffi kullanarak yapmak istiyorum. Bir nump dizisini bir cffi işlevine nasıl geçirirsiniz ve bir tane nasıl çıkartabilirsiniz?
void copy(float *in, float *out, int len) {
for (int i=0; i<len; i++) {
out[i] = in[i];
}
}
Şimdi iki numpy diziler oluşturmak ve bu bu fonksiyonu tarafından işlenecek istiyorum:
test amaçları için, ben önemsiz bir C işlevi yazdı.
- doğrudan kopyalama olmadan numpy Dizilerin yatan yüzer tamponlarını erişmek için bir yol var mı: Bu kodu geliştirmek istiyoruz, ancak
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)
: Bunu yapmanın bir yolunu onları?
ffi.buffer
, bir C dizisinin içeriğine hızlıca Numpy dizisine dönüştürmek için çok uygundur. Tek tek öğeleri kopyalamadan numpy dizisini bir C dizisine dönüştürmek için eşdeğer bir yol var mı?- Bazı uygulamalar için
float_in[0:16] = arr_in[0:16]
, verilere erişmenin kolay bir yoludur. Tersi,arr_out[0:16] = float_out[0:16]
, ancak çalışmaz. Neden olmasın? ndarray arasında
+1 atılımlar söz için – Matthias