Ho finalmente trovato un collo di bottiglia nelle prestazioni nel mio codice ma sono confuso su quale sia la ragione. Per risolverlo ho cambiato tutte le mie chiamate di numpy.zeros_like
per utilizzare invece numpy.zeros
. Ma perché lo zeros_like
è così tanto più lento?Perché la differenza di prestazioni tra numpy.zeros e numpy.zeros_like?
Per esempio (nota e-05
sulla chiamata zeros
):
>>> timeit.timeit('np.zeros((12488, 7588, 3), np.uint8)', 'import numpy as np', number = 10)
5.2928924560546875e-05
>>> timeit.timeit('np.zeros_like(x)', 'import numpy as np; x = np.zeros((12488, 7588, 3), np.uint8)', number = 10)
1.4402990341186523
Ma poi stranamente scrivendo a una matrice creata con zeros
è notevolmente più lento di una serie creata con zeros_like
:
>>> timeit.timeit('x[100:-100, 100:-100] = 1', 'import numpy as np; x = np.zeros((12488, 7588, 3), np.uint8)', number = 10)
0.4310588836669922
>>> timeit.timeit('x[100:-100, 100:-100] = 1', 'import numpy as np; x = np.zeros_like(np.zeros((12488, 7588, 3), np.uint8))', number = 10)
0.33325695991516113
mio suppongo che zeros
stia usando qualche trucco della CPU e non scriva effettivamente nella memoria per allocarlo. Questo è fatto al volo quando è scritto. Ma questo non spiega ancora la grande discrepanza nei tempi di creazione dell'array.
che sto con Mac OS X Yosemite con la versione corrente NumPy:
>>> numpy.__version__
'1.9.1'
'zeros' usa' memset'; 'zeros_like' sembra fare un' fill' che fa un sacco di sciocchezze. Ho provato a inseguire la vera esecuzione ma è inutilmente ottusa. – Veedrac
'zeri' non usa memset. –