Aggiunta di array NumPy è molto inefficiente. Questo perché l'interprete deve trovare e assegnare memoria all'intero array in ogni singolo passaggio. A seconda dell'applicazione, ci sono strategie molto migliori.
Se si conosce la lunghezza in anticipo, è meglio pre-allocare l'array utilizzando una funzione come np.ones
, np.zeros
o np.empty
.
desired_length = 500
results = np.empty(desired_length)
for i in range(desired_length):
results[i] = i**2
Se non si conosce la lunghezza, è probabilmente più efficace per mantenere i risultati in una lista regolare e convertirlo in una matrice in seguito.
results = []
while condition:
a = do_stuff()
results.append(a)
results = np.array(results)
Ecco alcuni tempi sul mio computer.
def pre_allocate():
results = np.empty(5000)
for i in range(5000):
results[i] = i**2
return results
def list_append():
results = []
for i in range(5000):
results.append(i**2)
return np.array(results)
def numpy_append():
results = np.array([])
for i in range(5000):
np.append(results, i**2)
return results
%timeit pre_allocate()
# 100 loops, best of 3: 2.42 ms per loop
%timeit list_append()
# 100 loops, best of 3: 2.5 ms per loop
%timeit numpy_append()
# 10 loops, best of 3: 48.4 ms per loop
Quindi è possibile vedere che sia la pre-allocazione che l'utilizzo di un elenco, quindi la conversione sono molto più veloci.
fonte
2014-09-03 16:59:53