Come molti parametri di riferimento, ciò dipende molto dai dettagli della situazione. È vero che, per impostazione predefinita, numpy crea array in ordine C contiguo (riga maggiore), quindi, in astratto, le operazioni di scansione su colonne dovrebbero essere più veloci di quelle che eseguono la scansione su righe. Tuttavia, la forma dell'array, le prestazioni dell'ALU e la cache sottostante sul processore hanno un impatto enorme sui particolari.
Ad esempio, sul mio MacBook Pro, con un piccolo numero intero o float matrice, i tempi sono simili, ma una piccola tipo intero è notevolmente inferiore al tipo float:
>>> x = numpy.ones((100, 100), dtype=numpy.uint8)
>>> %timeit x.sum(axis=0)
10000 loops, best of 3: 40.6 us per loop
>>> %timeit x.sum(axis=1)
10000 loops, best of 3: 36.1 us per loop
>>> x = numpy.ones((100, 100), dtype=numpy.float64)
>>> %timeit x.sum(axis=0)
10000 loops, best of 3: 28.8 us per loop
>>> %timeit x.sum(axis=1)
10000 loops, best of 3: 28.8 us per loop
Con matrici più grandi del assoluti differenze diventano più grandi, ma almeno sulla mia macchina sono ancora più piccola per il tipo di dati più grande:
>>> x = numpy.ones((1000, 1000), dtype=numpy.uint8)
>>> %timeit x.sum(axis=0)
100 loops, best of 3: 2.36 ms per loop
>>> %timeit x.sum(axis=1)
1000 loops, best of 3: 1.9 ms per loop
>>> x = numpy.ones((1000, 1000), dtype=numpy.float64)
>>> %timeit x.sum(axis=0)
100 loops, best of 3: 2.04 ms per loop
>>> %timeit x.sum(axis=1)
1000 loops, best of 3: 1.89 ms per loop
Si può dire NumPy per creare un array (column-major) Fortran contiguo utilizzando l'argomento order='F'
parola chiave per numpy.asarray
, numpy.ones
, numpy.zeros
e simili, o convertendo un array esistente usando numpy.asfortranarray
. Come previsto, questo ordinamento scambia l'efficienza delle operazioni di riga o colonna:
in [10]: y = numpy.asfortranarray(x)
in [11]: %timeit y.sum(axis=0)
1000 loops, best of 3: 1.89 ms per loop
in [12]: %timeit y.sum(axis=1)
100 loops, best of 3: 2.01 ms per loop
Si potrebbe voler controllare [questo] (http://stackoverflow.com/questions/17840661). È un esempio recente in cui vi è una grande differenza nelle operazioni su diversi assi. Anche se questo potrebbe essere un bug. – Daniel