Stavo implementando un sistema di ponderazione chiamato TF-IDF su un set di 42000 immagini, ciascuna costituita da 784 pixel. Questa è fondamentalmente una matrice 42000 per 784.Spiegare la differenza di velocità tra l'applicazione della funzione vettoriale di numpy VS python's for loop
Il primo metodo che ho tentato fatto uso di loop esplicite e ha preso più di 2 ore .
def tfidf(color,img_pix,img_total):
if img_pix==0:
return 0
else:
return color * np.log(img_total/img_pix)
...
result = np.array([])
for img_vec in data_matrix:
double_vec = zip(img_vec,img_pix_vec)
result_row = np.array([tfidf(x[0],x[1],img_total) for x in double_vec])
try:
result = np.vstack((result,result_row))
# first row will throw a ValueError since vstack accepts rows of same len
except ValueError:
result = result_row
Il secondo metodo ho tentato matrici NumPy usati e preso meno di 5 minuti. Nota che data_matrix, img_pix_mat sono entrambe 42000 per 784 matrici mentre img_total è uno scalare.
result = data_matrix * np.log(np.divide(img_total,img_pix_mat))
Speravo che qualcuno potrebbe spiegare l'immensa differenza di velocità.
Gli autori del seguente documento intitolato "La matrice NumPy: una struttura per un calcolo numerico e ffi ciente" (http://arxiv.org/pdf/1102.1523.pdf), indicano in cima alla pagina 4 che osservano un aumento di velocità 500 volte dovuto al calcolo vettorializzato. Presumo che gran parte dell'aumento di velocità che sto vedendo sia dovuto a questo. Tuttavia, vorrei fare un ulteriore passo avanti e chiedere perché i calcoli vettoriali compatti sono molto più veloci dei loop standard di Python?
Inoltre, forse voi ragazzi potreste sapere di altri motivi per cui il primo metodo è lento. Prova/eccetto che le strutture hanno un sovraccarico? O forse la formazione di un nuovo np.array per ogni ciclo richiede molto tempo?
Grazie.
Questo spiega i motivi per cui l'uso di C di Numpy è molto più veloce: http: // stackoverflow.com/q OMANDE/8385602/why-sono-NumPy-array-così-veloce. –