El tiempo de acceso de una matriz numpy se ve mucho más afectado por el último índice en comparación con el segundo último

Este es un seguimiento deesta respuesta a mi pregunta anteriorEnfoque más rápido para leer miles de imágenes en una gran matriz numpy.

Encapítulo 2.3 "Asignación de memoria del ndarray", Travis Oliphant escribe lo siguiente con respecto a cómo se accede a los índices en la memoria para las matrices numpy ordenadas en C.

... para moverse secuencialmente por la memoria de la computadora, el último índice se incrementa primero, seguido del penúltimo índice y así sucesivamente.

Esto se puede confirmar mediante la evaluación comparativa del tiempo de acceso de las matrices 2-D a lo largo de los dos primeros o los dos últimos índices (para mi propósito, esta es una simulación de cargar 500 imágenes de tamaño 512x512 píxeles):

import numpy as np

N = 512
n = 500
a = np.random.randint(0,255,(N,N))

def last_and_second_last():
    '''Store along the two last indexes'''
    imgs = np.empty((n,N,N), dtype='uint16')
    for num in range(n):
        imgs[num,:,:] = a
    return imgs

def second_and_third_last():
    '''Store along the two first indexes'''
    imgs = np.empty((N,N,n), dtype='uint16')
    for num in range(n):
        imgs[:,:,num] = a
    return imgs

Punto de referencia

In [2]: %timeit last_and_second_last()
136 ms ± 2.18 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [3]: %timeit second_and_third_last()
1.56 s ± 10.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Hasta aquí todo bien. Sin embargo, cuando cargo matrices a lo largo de la última y tercera dimensión, esto es casi tan rápido como cargarlas en las dos últimas dimensiones.

def last_and_third_last():
    '''Store along the last and first indexes'''
    imgs = np.empty((N,n,N), dtype='uint16')
    for num in range(n):    
        imgs[:,num,:] = a
    return imgs

Punto de referencia

In [4]: %timeit last_and_third_last()
149 ms ± 227 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Por qué es esolast_and_third_last() es tan cerca de mi velocidadlast_and_second_last() comparado consecond_and third_last()?¿Cuál es una buena manera de visualizar por qué el último índice importa mucho más que el segundo último índice en cuanto a la velocidad de acceso?

Respuestas a la pregunta(4)

Su respuesta a la pregunta