Como passar uma matriz Numpy em uma função cffi e como obter uma volta?

Estou desenvolvendo um algoritmo de áudio usando Python e Numpy. Agora eu quero acelerar esse algoritmo implementando uma parte dele em C. No passado,Eu fiz isso usando cython. Agora eu quero fazer a mesma coisa usando o novocffi.

Para fins de teste, escrevi uma função C trivial:

void copy(float *in, float *out, int len) {
    for (int i=0; i<len; i++) {
        out[i] = in[i];
    }
}

Agora quero criar dois matrizes numpy e tê-los processados ​​por essa função. Eu descobri uma maneira de fazer isso:

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)

No entanto, gostaria de melhorar este código:

Existe uma maneira de acessar diretamente os buffers flutuantes subjacentes dos matrizes numpy sem copiá-los?ffi.buffer é muito conveniente para converter rapidamente o conteúdo de um array C em um array Numpy. Existe uma maneira equivalente de converter rapidamente um array numpy em um array C sem copiar os elementos individuais?Para algumas aplicações,float_in[0:16] = arr_in[0:16] é uma maneira conveniente de acessar dados. O oposto,arr_out[0:16] = float_out[0:16] não funciona no entanto. Por que não?

questionAnswers(4)

yourAnswerToTheQuestion