Visões de memória digitadas Cython: o que realmente são?

O Cythondocumentação explica muito bem o que eles permitem, como você pode declará-los e como usá-los.

No entanto, ainda não está claro para mim o que eles realmente são. Por exemplo, uma atribuição simples de uma matriz numpy como esta:

my_arr = np.empty(10, np.int32)
cdef int [:] new_arr = my_arr

pode fazer o acesso / atribuição demy_arr Mais rápido.

O que está acontecendo nos bastidores? O Numpy já deve alocar os elementos na memória de maneira contígua, então qual é o problema com as visões de memória? Aparentemente, não tanto assim, de fato, a atribuição de visualização de memória da matriz numpynew_arr deve ser equivalente a

cdef np.ndarray[np.int32_t, ndim=1] new_arr = np.empty(10, np.int32)

em termos de velocidade. No entanto, as visões de memória são consideradas mais gerais que o buffer numérico da matriz; você poderia fazer um exemplo simples em que a generalização adicionada é importante / interessante?

Além disso, se eu já aloquei um ponteiro para tornar as coisas o mais rápido possível, qual é a vantagem de convertê-lo para uma visão de memória digitada? (a resposta a esta pergunta pode ser a mesma que a acima)

cdef int *my_arr = <int *> malloc(N * sizeof(int))
cdef int[:] new_arr = <int[:N]>my_arr

questionAnswers(1)

yourAnswerToTheQuestion