Niedawno odpowiedział na THIS pytanie, które chciał mnożenie 2 wymieniono niektóre użytkownik zaproponował następujący sposób przy użyciu numpy, obok kopalni, które myślę, że to jest właściwy sposób:Dlaczego rozumienie list jest dużo szybsze niż numpy w przypadku mnożenia tablic?
(a.T*b).T
Ponadto stwierdziliśmy, że aray.resize()
ma takie same wydajność w ten sposób. jakiś sposób inna odpowiedź sugerowane rozwiązanie używając listowych:
[[m*n for n in second] for m, second in zip(b,a)]
Ale po benchmarku Widziałem, że lista zrozumieniem wykonuje bardzo szybciej niż 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")
wynik:
first: 1.49778485298
second : 7.43547797203
Jak widać numpy jest około 5 razy szybszy. ale najbardziej zaskakujące było to, że jej szybciej bez użycia transpozycji, oraz do następującego kodu:
a=np.array([[2,3,5],[3,6,2],[1,3,2]])
b=np.array([[4],[2],[1]])
a*b
Lista rozumienie nadal był 5 raz faster.So oprócz tego stopnia, że listowych wykonuje w C tutaj użyliśmy 2 zagnieżdżonych pętli i funkcja zip
Więc jaki może być powód? Czy to z powodu operacji *
w numpy?
Należy również zauważyć, że nie ma problemu z timeit
tutaj wstawiłem część import
w setup
.
ja też próbowałem z większymi Arras, różnica staje się mniejsze, ale nadal nie ma sensu:
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")
wynik:
first: 10.7480301857
second : 13.1278889179
.... Spróbuj dużo większych tablic? – NightShadeQueen
@NightShadeQueen Próbowałem, że nadal ten sam wynik – Kasramvd
@Kasramvd jak dużo większy próbowałeś? – Falmarri