Beschleunige das strukturierte NumPy-Array

9

NumPy -Arrays sind sowohl für die Leistung als auch für die einfache Verwendung (einfacheres Schneiden, Indizieren als Listen) hervorragend geeignet.

Ich versuche, einen Datencontainer aus einem NumPy structured array anstelle von dict von NumPy arrays zu konstruieren. Das Problem ist, dass die Leistung viel schlechter ist. Ungefähr 2,5 Mal so schlecht mit homogenen Daten und ungefähr 32 Mal für heterogene Daten (ich spreche von NumPy datatypes).

Gibt es eine Möglichkeit, das strukturierte Array zu beschleunigen? Ich habe versucht, die Speicherordnung von 'c' zu 'f' zu ändern, aber das hatte keine Auswirkungen.

Hier ist mein Profiling-Code:

%Vor%

Bearbeiten : Ich habe vergessen, meine Timing-Nummern einzugeben:

%Vor%

Edit2 : Ich habe einen zusätzlichen Testfall mit dem timit-Modul hinzugefügt:

%Vor%

ergibt:

%Vor%

Die Verhältnisse zwischen den Läufen scheinen einigermaßen stabil zu sein. Verwenden Sie beide Methoden und eine andere Größe des Arrays.

Für den Fall ist es wichtig: Python: 3.4 NumPy: 1.9.2

    
magu_ 21.01.2016, 18:59
quelle

1 Antwort

2

In meinen schnellen Timing-Tests ist der Unterschied nicht so groß:

%Vor%

Im Fall dict_homo ist die Tatsache, dass das Array in ein Wörterbuch eingebettet ist, ein untergeordneter Punkt. Ein einfacher Wörterbuchzugriff wie dieser ist schnell, im Prinzip das Gleiche wie der Zugriff auf das Array nach dem Variablennamen.

Also der erste Fall, es ist im Grunde ein Test von += für ein 1d Array.

Im strukturierten Fall wechseln sich die Werte a und b im Datenpuffer ab, so dass np_homo['a'] eine Ansicht ist, die alternative Zahlen "herauszieht". Es ist also nicht verwunderlich, dass es etwas langsamer wäre.

%Vor%

Ein 2d-Array verschachtelt auch die Spaltenwerte.

%Vor%

Überraschenderweise ist es tatsächlich ein bisschen langsamer als der strukturierte Fall. Die Verwendung von order='F' oder (2.10000) Shape beschleunigt es ein wenig, aber immer noch nicht so gut wie der strukturierte Fall.

Das sind kleine Testzeiten, also werde ich keine großen Ansprüche stellen. Aber das strukturierte Array schaut nicht zurück.

Ein weiterer Zeittest, der das Array oder das Wörterbuch in jedem Schritt neu initialisiert

%Vor%

2d und strukturiert sind näher, mit etwas besserer Leistung für den Fall des Wörterbuchs (1d). Ich habe das auch mit np.ones versucht, da np.zeros eine verzögerte Zuweisung haben kann, aber keinen Unterschied im Verhalten.

    
hpaulj 21.01.2016 20:46
quelle

Tags und Links