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