Sono relativamente nuovo a Python e ho un ciclo annidato per. Poiché i cicli for richiedono un po 'di tempo per essere eseguiti, sto cercando di capire come convalidare questo codice in modo che possa funzionare più velocemente.Vettorizzazione per loop NumPy
In questo caso, coord è un array tridimensionale in cui coord [x, 0, 0] e coord [x, 0, 1] sono numeri interi e coord [x, 0, 2] è 0 o 1. H è una matrice sparsa SciPy e x_dist, y_dist, z_dist e a sono tutti float.
# x_dist, y_dist, and z_dist are floats
# coord is a num x 1 x 3 numpy array where num can go into the hundreds of thousands
num = coord.shape[0]
H = sparse.lil_matrix((num, num))
for i in xrange(num):
for j in xrange(num):
if (np.absolute(coord[i, 0, 0] - coord[j, 0, 0]) <= 2 and
(np.absolute(coord[i, 0, 1] - coord[j, 0, 1]) <= 1)):
x = ((coord[i, 0, 0] * x_dist + coord[i, 0, 2] * z_dist) -
(coord[j, 0, 0] * x_dist + coord[j, 0, 2] * z_dist))
y = (coord[i, 0, 1] * y_dist) - (coord[j, 0, 1] * y_dist)
if a - 0.5 <= np.sqrt(x ** 2 + y ** 2) <= a + 0.5:
H[i, j] = -2.7
Ho anche letto che la trasmissione con NumPy, mentre molto più veloce, può portare a grandi quantità di utilizzo della memoria da array temporaneo. Sarebbe meglio andare sulla via della vettorizzazione o provare ad usare qualcosa come Cython?
Grazie per il suggerimento! Tuttavia, quando provo a mettere questo in uno script (usando il decoratore @autojit) e il tempo con IPython (% timeit% eseguire Test.py), ottengo risultati che sono costantemente più lenti del normale Python. Hai idea del perché questo sta accadendo? – sonicxml
@sonicxml Questo è interessante. Stai usando gli stessi dati del mio esempio? Autojit ha bisogno di compilare la tua funzione per ogni nuovo tipo di dati che gli passi, e lo fa in fase di runtime. Pertanto, per piccoli esempi potrebbe essere più lento a causa del tempo di compilazione. Potrebbe essere il problema dell'esempio che stai utilizzando? – jcrudy
Ahh okay. Avevo eseguito un array più piccolo solo per testarlo, ma ora che ho reso l'array più grande numba sta diventando molto più veloce di python. – sonicxml