NumPy
Gli array sono eccezionali sia per le prestazioni che per l'utilizzo semplice (semplificazione delle operazioni di taglio, indicizzazione rispetto agli elenchi).Accelerare l'array NumPy strutturato
Provo a costruire un contenitore di dati da un NumPy structured array
anziché dict
di NumPy arrays
. Il problema è che le prestazioni sono molto peggiori. Circa 2,5 volte tanto male utilizzando dati omogenei e circa 32 volte per dati eterogenei (sto parlando dei tipi di dati NumPy
).
C'è un modo per velocizzare l'array strutturato? Ho provato a cambiare il memoryorder da 'c' a 'f', ma questo non ha avuto alcun effetto.
Ecco il mio codice profiling:
import time
import numpy as np
NP_SIZE = 100000
N_REP = 100
np_homo = np.zeros(NP_SIZE, dtype=[('a', np.double), ('b', np.double)], order='c')
np_hetro = np.zeros(NP_SIZE, dtype=[('a', np.double), ('b', np.int32)], order='c')
dict_homo = {'a': np.zeros(NP_SIZE), 'b': np.zeros(NP_SIZE)}
dict_hetro = {'a': np.zeros(NP_SIZE), 'b': np.zeros(NP_SIZE, np.int32)}
t0 = time.time()
for i in range(N_REP):
np_homo['a'] += i
t1 = time.time()
for i in range(N_REP):
np_hetro['a'] += i
t2 = time.time()
for i in range(N_REP):
dict_homo['a'] += i
t3 = time.time()
for i in range(N_REP):
dict_hetro['a'] += i
t4 = time.time()
print('Homogeneous Numpy struct array took {:.4f}s'.format(t1 - t0))
print('Hetoregeneous Numpy struct array took {:.4f}s'.format(t2 - t1))
print('Homogeneous Dict of numpy arrays took {:.4f}s'.format(t3 - t2))
print('Hetoregeneous Dict of numpy arrays took {:.4f}s'.format(t4 - t3))
Edit: Ho dimenticato di mettere i miei valori di temporizzazione:
Homogenious Numpy struct array took 0.0101s
Hetoregenious Numpy struct array took 0.1367s
Homogenious Dict of numpy arrays took 0.0042s
Hetoregenious Dict of numpy arrays took 0.0042s
Edit2: ho aggiunto qualche banco di prova supplementare con il modulo timit:
import numpy as np
import timeit
NP_SIZE = 1000000
def time(data, txt, n_rep=1000):
def intern():
data['a'] += 1
time = timeit.timeit(intern, number=n_rep)
print('{} {:.4f}'.format(txt, time))
np_homo = np.zeros(NP_SIZE, dtype=[('a', np.double), ('b', np.double)], order='c')
np_hetro = np.zeros(NP_SIZE, dtype=[('a', np.double), ('b', np.int32)], order='c')
dict_homo = {'a': np.zeros(NP_SIZE), 'b': np.zeros(NP_SIZE)}
dict_hetro = {'a': np.zeros(NP_SIZE), 'b': np.zeros(NP_SIZE, np.int32)}
time(np_homo, 'Homogeneous Numpy struct array')
time(np_hetro, 'Hetoregeneous Numpy struct array')
time(dict_homo, 'Homogeneous Dict of numpy arrays')
time(dict_hetro, 'Hetoregeneous Dict of numpy arrays')
in:
Homogeneous Numpy struct array 0.7989
Hetoregeneous Numpy struct array 13.5253
Homogeneous Dict of numpy arrays 0.3750
Hetoregeneous Dict of numpy arrays 0.3744
I rapporti tra le piste sembrano ragionevolmente stabili. Utilizzando entrambi i metodi e una diversa dimensione dell'array.
Per l'offcase è importante: pitone: 3.4 NumPy: 1.9.2
Poiché questa domanda richiede un problema di prestazioni specifico con NumPy piuttosto che una critica generale, è stata eseguita la migrazione da Code Review a Stack Overflow. –
Se si vuole veramente lavorare con array strutturati, suggerirei di dare una prova a [panda] (http://pandas.pydata.org/). –
Vedere questo numero: https://github.com/numpy/numpy/issues/6467 – MaxNoe