我正在使用 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]
它不起作用。为什么不?