Vor kurzem habe ich zu THIS Frage beantwortet, die die Vermehrung von 2 Listen wollte, schlug einige Benutzer die folgende Art und Weise numpy verwenden, neben meiner, die ich denke, der richtige Weg ist:Warum ist das Verständnis von Listen viel schneller als das Multiplizieren von Arrays?
(a.T*b).T
Auch fand ich, dass aray.resize()
hat eine gleiche Leistung wie das. eine Möglichkeit vorgeschlagen, eine andere Antwort, eine Lösung mit Liste Verständnis:
[[m*n for n in second] for m, second in zip(b,a)]
Aber nach dem Benchmark sah ich, dass die Liste Verständnis als numpy sehr schneller ausführt:
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")
Ergebnis:
first: 1.49778485298
second : 7.43547797203
Wie Sie sehen können, ist numpy ungefähr 5 mal schneller. aber die meisten überraschend war, dass seine schneller ohne transponieren zu verwenden und für folgenden Code:
a=np.array([[2,3,5],[3,6,2],[1,3,2]])
b=np.array([[4],[2],[1]])
a*b
Die Liste Verständnis noch 5 Mal faster.So war neben diesem Punkt, die Listenkomprehensionen in C führt hier verwenden wir zwei verschachtelte Schleife und eine zip
Funktion Was kann der Grund sein? Ist es wegen der Operation *
in numpy?
Beachten Sie auch, dass es kein Problem mit timeit
gibt hier putted ich den import
Teil in setup
.
Ich versuchte es auch mit größeren arras, der Unterschied wird geringer, aber immer noch keinen Sinn macht:
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")
Ergebnis:
first: 10.7480301857
second : 13.1278889179
.... Versuchen Sie viel größere Arrays? – NightShadeQueen
@NightShadeQueen Ich versuchte das immer noch das gleiche Ergebnis – Kasramvd
@Kasramvd wie viel größer haben Sie versucht? – Falmarri