Diciamo che voglio fare una somma elemento-saggio di una lista di array NumPy:sommando rapidamente array NumPy elemento-saggio
tosum = [rand(100,100) for n in range(10)]
sto cercando il modo migliore per farlo. Sembra che numpy.sum è terribile:
timeit.timeit('sum(array(tosum), axis=0)',
setup='from numpy import sum; from __main__ import tosum, array',
number=10000)
75.02289700508118
timeit.timeit('sum(tosum, axis=0)',
setup='from numpy import sum; from __main__ import tosum',
number=10000)
78.99106407165527
Ridurre è molto più veloce (per la somma di quasi due ordini di grandezza):
timeit.timeit('reduce(add,tosum)',
setup='from numpy import add; from __main__ import tosum',
number=10000)
1.131795883178711
Esso si presenta come ridurre ha anche un vantaggio significativo sul somma non NumPy (notare che questi sono per 1E6 corre piuttosto che 1E4 per i tempi di cui sopra):
timeit.timeit('reduce(add,tosum)',
setup='from numpy import add; from __main__ import tosum',
number=1000000)
109.98814797401428
timeit.timeit('sum(tosum)',
setup='from __main__ import tosum',
number=1000000)
125.52461504936218
ci sono altri metodi che dovrei provare? Qualcuno può spiegare le classifiche?
Modifica
numpy.sum è sicuramente più veloce se la lista è trasformato in una matrice di NumPy prima:
tosum2 = array(tosum)
timeit.timeit('sum(tosum2, axis=0)',
setup='from numpy import sum; from __main__ import tosum2',
number=10000)
1.1545608043670654
Tuttavia, sono interessati solo a fare una somma una volta , quindi trasformare la matrice in una matrice numpy comporterebbe comunque una vera penalità delle prestazioni.
Sto indovinando che 'np.sum' prima crea e matrice e poi lo riassume il che spiegherebbe è scarso rendimento ... sto cercando di indovinare che sarebbe stato il più veloce se si fosse passato un' np. ndarray' per cominciare. – mgilson
E mi aspetto che riduca per battere 'sum' di circa 1/11 dato che salta il' 0 + tosum [0] 'che è implicito in' sum'. – mgilson
Questo ha senso. Comincio con un gruppo di array separati, quindi trasformarli in una serie numpy in primo luogo comporterebbe la stessa penalizzazione delle prestazioni di come la somma lo fa per me (dal momento che sto facendo la somma una sola volta). – lnmaurer