Recentemente ho risposto a THIS domanda che ha voluto la moltiplicazione delle 2 liste, qualche utente ha suggerito seguente modo utilizzando NumPy, al fianco di mia che credo sia il modo corretto:Perché la comprensione degli elenchi è molto più veloce di numpy per la moltiplicazione degli array?
(a.T*b).T
Inoltre ho scoperto che aray.resize()
ha una stessa prestazioni del genere. alcun modo un'altra risposta ha suggerito una soluzione che utilizza la lista di comprensione:
[[m*n for n in second] for m, second in zip(b,a)]
Ma dopo il punto di riferimento ho visto che la lista di comprensione esegue molto più velocemente di quanto NumPy:
from timeit import timeit
s1="""
a=[[2,3,5],[3,6,2],[1,3,2]]
b=[4,2,1]
[[m*n for n in second] for m, second in zip(b,a)]
"""
s2="""
a=np.array([[2,3,5],[3,6,2],[1,3,2]])
b=np.array([4,2,1])
(a.T*b).T
"""
print ' first: ' ,timeit(stmt=s1, number=1000000)
print 'second : ',timeit(stmt=s2, number=1000000,setup="import numpy as np")
risultato:
first: 1.49778485298
second : 7.43547797203
Come puoi vedere, numpy è circa 5 volte più veloce. ma cosa più sorprendente è che il suo più veloce senza l'utilizzo di recepire, e per la seguente codice:
a=np.array([[2,3,5],[3,6,2],[1,3,2]])
b=np.array([[4],[2],[1]])
a*b
La lista di comprensione era ancora 5 tempo faster.So oltre questo punto che di lista si esibisce in C qui abbiamo usato 2 ciclo nidificato e una funzione zip
Quindi quale può essere la ragione? È a causa dell'operazione *
in numpy?
Si noti inoltre che non vi sono problemi con timeit
qui ho inserito la parte import
in setup
.
Ho anche provato con arazzi grandi, la differenza diventa inferiore ma ancora non ha senso:
s1="""
a=[[2,3,5],[3,6,2],[1,3,2]]*10000
b=[4,2,1]*10000
[[m*n for n in second] for m, second in zip(b,a)]
"""
s2="""
a=np.array([[2,3,5],[3,6,2],[1,3,2]]*10000)
b=np.array([4,2,1]*10000)
(a.T*b).T
"""
print ' first: ' ,timeit(stmt=s1, number=1000)
print 'second : ',timeit(stmt=s2, number=1000,setup="import numpy as np")
risultato:
first: 10.7480301857
second : 13.1278889179
.... Prova matrici molto più grandi? – NightShadeQueen
@NightShadeQueen Ho provato ancora lo stesso risultato – Kasramvd
@Kasramvd quanto più grande hai provato? – Falmarri