2016-06-23 8 views
1

Ich habe große Arrays in vielen Iterationen auch zu multiplizieren.Multiplikation von großen Arrays in Python

Ich trainiere ein Modell mit Array lang um 1500 und ich werde 3 Multiplikationen für etwa 1000000 mal durchführen, was eine lange Zeit fast Woche dauert.

fand ich Dask Ich versuchte es mit der normalen numpy Art und Weise zu vergleichen, aber ich fand numpy schneller:

x = np.arange(2000) 

start = time.time() 
y = da.from_array(x, chunks=(100)) 

for i in range (0,100): 
    p = y.dot(y) 

#print(p) 
print(time.time() - start) 

print('------------------------------') 

start = time.time() 

p = 0 

for i in range (0,100): 
    p = np.dot(x,x) 

print(time.time() - start) 

0,08502793312072754

0,00015974044799804688

verwende ich dask falsch oder es ist so schnell wie numpig?

Antwort

2

Die Leistung für .dot hängt stark von der BLAS library ab, mit der Ihre NumPy-Implementierung verknüpft ist.

Wenn Sie eine moderne Implementierung wie OpenBLAS oder MKL haben, läuft NumPy bereits mit voller Geschwindigkeit und verwendet alle Ihre Kerne. In diesem Fall wird dask.array wahrscheinlich nur in den Weg kommen und versuchen, weitere Parallelität hinzuzufügen, wenn keine Gewähr besteht, was Thread-Konflikte verursacht.

Wenn Sie NumPy über Anaconda installiert haben, dann haben Sie wahrscheinlich bereits OpenBLAS oder MKL, also würde ich einfach mit der Leistung, die Sie haben, zufrieden sein und es einen Tag nennen.

In Ihrem tatsächlichen Beispiel verwenden Sie jedoch Stücke, die viel zu klein sind (chunks=(100,)). Der Task-Scheduler benötigt ungefähr eine Millisekunde Overhead pro Task. Sie sollten eine Chunksize wählen, so dass jede Aufgabe irgendwo in den 100 Millisekunden dauert, um diesen Overhead zu verbergen. Im Allgemeinen ist es eine gute Faustregel, nach Blöcken zu suchen, die größer als ein Megabyte sind. Dies verursacht den großen Unterschied in der Leistung, die Sie sehen.

+0

Ich erhöhte den Brocken und das Beste ist 0,054, die immer noch weit von Numpy. Ich denke, wie Sie gesagt haben, ist Numpy bereits parallelisiert. Vielen Dank für Ihre ausführliche Erklärung, es ist jetzt klarer –

+0

Ja, für kleine schnelle Probleme der Overhead von parallelen Computing-Frameworks in der Regel mehr in die Quere kommt als es hilft. – MRocklin