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];
}
}
ここで、2 つの 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]
機能しません。なぜだめですか?