Ich hatte die Gelegenheit, an der Verbesserung der Berechnungseffizienz von Numpy zu arbeiten. Dabei habe ich gelernt, wie wichtig dtype ist.
Als persönliches Memorandum hoffe ich natürlich, dass es jemandem nützlich sein wird. Was ich geschrieben habe, ist dieser Artikel.
[Zusatz] numpy ist ein numpy.array, das durch Anwenden der Methode ".values" auf die Datenrahmenversion von pandas read_csv erstellt wurde.
Wenn ich es schreibe,
Ich musste den Prozess machen, aber nur durch Ändern des D-Typs von Numpy Ich konnte es wie folgt verbessern. (Wie schrecklich es zuerst war ...)
Artikel | before | after |
---|---|---|
Verarbeitungszeit | 70 Minuten | 10 Minuten |
Speicher verwendet | Über 100 GB | Über 30 GB |
Im Folgenden werde ich schreiben, welche Art von Änderungen ich vorgenommen habe.
** Setze dtype von numpy.array auf float32 oder float64
**
Es scheint, dass die Matrixberechnung von numpy [BLAS] verwendet (https://ja.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms). Es scheint also, dass dieser Typ gute Arbeit leisten wird, wenn es sich um den oben genannten Datentyp handelt. (Siehe den Artikel oben im Referenzlink)
In meinem Fall war es zuerst int, aber mit .astype (np.float32)
Durch einfaches Ändern des Typs in float32 wurde die Verarbeitungszeit von 70 Minuten auf 10 Minuten reduziert! !!
[Zusatz] Nachdem ich über Nacht geschlafen und erneut gelesen hatte, dachte ich, dass die Erklärung der Situation unzureichend sei, deshalb werde ich sie ein wenig ergänzen.
Ursprünglich eine Hot-Codierung mit pd.get_dummies
und dann mit .values
Ich nahm numpy.ndarray heraus und berechnete es.
Bei dieser Methode lautet der Datentyp uint8, dies wird jedoch in float32 geändert. Ich konnte eine hohe Geschwindigkeit erreichen, indem ich sie änderte.
Der Code sieht so aus.
pd.get_dummies([Pandas-Serie]).astype(np.float32).values
** Wenn möglich, setzen Sie den Wert der Matrix auf den Bool-Wert **
Der oben erwähnte Floating-Prozess machte den Prozess explosiv, aber der Speicher wurde verbraucht. Früher habe ich mich gewehrt, indem ich oft unnötige Objekte "gelöscht" habe, aber es hat keine große Verbesserung gebracht.
Durch erneutes Halten des Berechnungsergebnisses in bool konnte ich jedoch viel Speicherplatz sparen. (Es scheint, dass der im Voraus reservierte Speicher zwischen dem Bool-Typ und dem Int-Float-Typ unterschiedlich ist.)
[Ergänzung] In Python gilt die folgende Beziehung zwischen "1/0" und "Wahr / Falsch".
Eine Matrix, die durch 1/0 dargestellt werden kann (zum Beispiel eine One-Hot-Codierungsmatrix), ist also Es kann auch als Bool-Wert ausgedrückt werden.
Wie oben erwähnt, konnten wir die Effizienz allein durch die Kombination der beiden Punkte erheblich verbessern. Am Ende war der Prozessablauf so.
ArrayA = float32 matrix @ float32 matrix
arrayA = (arrayA> = 1)
result = arrayA | arrayB | arrayC
MögenDer Schwimmer scheint in verschiedenen Fällen verwendbar zu sein, aber ist der Bool begrenzt? Ich denke nicht, dass es angewendet werden kann, wenn das Ergebnis nicht durch 0/1 dargestellt werden kann.
Recommended Posts