Erstellen Sie effizient 2d Histogramme aus großen Datensätzen

8

Ich möchte 2D-Histogramme in Python aus großen Datensätzen (100000+ Samples) erstellen, die in einer HDF5-Datei gespeichert sind. Ich habe den folgenden Code gefunden:

%Vor%

Die Ausführung dauert ungefähr 15 Sekunden (100000 Datenpunkte). Der CERN-Root hingegen (unter Verwendung seiner eigenen Baumdatenstruktur anstelle von HDF5) kann dies in weniger als 1s tun. Hast du eine Idee, wie ich den Code beschleunigen könnte? Ich könnte auch die Struktur der HDF5-Daten ändern, wenn es hilfreich wäre.

    
AbuBakr 10.01.2012, 15:18
quelle

3 Antworten

14

Ich würde ein paar verschiedene Dinge versuchen.

  1. Laden Sie Ihre Daten aus der hdf-Datei, anstatt die tatsächlich im Speicher abgebildeten Arrays zu übergeben.
  2. Wenn das Problem dadurch nicht behoben wird, können Sie ein scipy.sparse.coo_matrix verwenden, um das 2D-Histogramm zu erstellen. Bei älteren Versionen von numpy kann digitize (die alle internen Funktionen histogram* intern verwenden) unter Umständen zu viel Speicher verwenden. Es ist jedoch nicht mehr der Fall mit den letzten (& gt; 1.5 ??) Versionen von numpy.

Als Beispiel für den ersten Vorschlag würden Sie Folgendes tun:

%Vor%

Der Unterschied besteht hier darin, dass die Gesamtheit der Arrays in den Speicher gelesen wird, anstatt die arrayähnlichen Objekte von h5py zu sein, die im Grunde effiziente speicherplatzierte Arrays sind, die gespeichert werden > auf Festplatte .

Was den zweiten Vorschlag betrifft, versuchen Sie es nicht, es sei denn, der erste Vorschlag hat Ihrem Problem nicht geholfen.

Es wird wahrscheinlich nicht wesentlich schneller (und ist wahrscheinlich langsamer für kleine Arrays), und mit den letzten Versionen von numpy ist es nur etwas mehr Speicher-effizient. Ich habe einen Code, wo ich das bewusst mache, aber ich würde es generell nicht empfehlen. Es ist eine sehr haschische Lösung. In sehr ausgewählten Umständen (viele Punkte und viele Bins) kann es jedoch besser als histogram2d vorformen.

All diese Vorbehalte beiseite, hier ist es:

%Vor%

Auf meinem System ergibt dies:

%Vor%     
Joe Kington 10.01.2012, 15:42
quelle
3

Sie müssen herausfinden, ob sich der Engpass in der Datenladung oder in histogram2d befindet. Versuchen Sie, eine Zeitmessung in Ihren Code einzufügen.

Sind A- und T-Felder oder sind sie Generatorobjekte? Wenn letzteres dann mehr Sorgfalt benötigt wird, um zu unterscheiden, wo der Flaschenhals ist; Möglicherweise müssen Sie sie zuerst in numply-Arrays entpacken, um sie zu testen.

    
Sideshow Bob 10.01.2012 15:33
quelle
2

Läuft die ganze Sache in 15s oder nur der Aufruf von histogram2d? Der Import der pylab-Familie kann viel Zeit in Anspruch nehmen. Die numpy histogram2d Funktion sollte in C implementiert werden, wenn ich mich richtig erinnere, also bezweifle ich, dass es dort Leistungsprobleme gibt. Sie können Python beschleunigen, indem Sie Ihr Skript mit dem Optimierungsflag --OO

aufrufen %Vor%

Erwägen Sie auch die Verwendung von Psycho , um die Leistung zu verbessern.

    
edvaldig 10.01.2012 15:36
quelle

Tags und Links