¿Cuál es la forma recomendada de asignar memoria para una vista de memoria escrita?

losDocumentación de Cython sobre vistas de memoria mecanografiadas. enumerar tres formas de asignar a una vista de memoria escrita:

de un puntero C crudo,a partir de unanp.ndarray ya partir de unacython.view.array.

Supongamos que no tengo datos transferidos a mi función de cython desde el exterior, sino que quiero asignar memoria y devolverla como unnp.ndarray, ¿cuál de esas opciones elegí? Además, suponga que el tamaño de ese búfer no es una constante de tiempo de compilación, es decir, no puedo asignar en la pila, pero sería necesariomalloc para la opción 1.

Las 3 opciones por lo tanto se verían algo como esto:

from libc.stdlib cimport malloc, free
cimport numpy as np
from cython cimport view

np.import_array()

def memview_malloc(int N):
    cdef int * m = <int *>malloc(N * sizeof(int))
    cdef int[::1] b = <int[:N]>m
    free(<void *>m)

def memview_ndarray(int N):
    cdef int[::1] b = np.empty(N, dtype=np.int32)

def memview_cyarray(int N):
    cdef int[::1] b = view.array(shape=(N,), itemsize=sizeof(int), format="i")

Lo que me sorprende es que en los tres casos,Cython genera bastante código para la asignación de memoria, en particular una llamada a__Pyx_PyObject_to_MemoryviewSlice_dc_int. Esto sugiere (y podría estar equivocado aquí, mi percepción del funcionamiento interno de Cython es muy limitada) que primero crea un objeto Python y luego lo "convierte" en una vista de memoria, lo que parece una sobrecarga innecesaria.

A simple punto de referencia no revela mucha diferencia entre los tres métodos, siendo 2. el más rápido por un margen delgado.

¿Cuál de los tres métodos se recomienda? ¿O hay una opción diferente, mejor?

Siguiente pregunta: Quiero finalmente devolver el resultado comonp.ndarray, después de haber trabajado con esa vista de memoria en la función. ¿Es una vista de memoria escrita la mejor opción o preferiría usar la antigua interfaz de búfer como se muestra a continuación para crear unndarray ¿en primer lugar?

cdef np.ndarray[DTYPE_t, ndim=1] b = np.empty(N, dtype=np.int32)

Respuestas a la pregunta(2)

Su respuesta a la pregunta