Was ist der schnellste Weg, eine große Liste in Python 2.7 zu speichern / zu laden?

8

Was ist der schnellste Weg, eine große Liste in Python 2.7 zu speichern / zu laden? Ich entschuldige mich, wenn das schon gefragt wurde, ich konnte keine Antwort auf diese genaue Frage finden, als ich suchte ...

Genauer gesagt probiere ich Methoden aus, um etwas zu simulieren, und ich muss das Ergebnis jeder Testmethode mit einer exakten Lösung vergleichen. Ich habe ein Python-Skript, das eine Liste von Werten erzeugt, die die exakte Lösung darstellen, und ich möchte es nicht jedes Mal neu berechnen, wenn ich eine neue Simulation starte. Daher möchte ich es irgendwo speichern und einfach die Lösung laden, anstatt sie jedes Mal neu zu berechnen, wenn ich sehen möchte, wie gut meine Simulationsergebnisse sind.

Ich brauche die gespeicherte Datei auch nicht, um lesbar zu sein. Ich muss es nur in Python laden können.

    
nukeguy 05.05.2015, 15:30
quelle

4 Antworten

7

Die Verwendung von np.load und tolist ist wesentlich schneller als bei jeder anderen Lösung:

%Vor%

In python 3 ist numpy viel effizienter, wenn Sie ein numpy Array verwenden:

%Vor%

Wenn Sie eine Liste wünschen, ist es noch schneller, tolist aufzurufen und np.load zu verwenden:

%Vor%     
Padraic Cunningham 05.05.2015, 15:48
quelle
2

Wie PadraicCunningham bereits erwähnt hat, könnt ihr die Liste pürieren.

%Vor%

lädt die Liste in eine Datei.

Und um es zu extrahieren:

%Vor%

Das HIGHEST_PROTOCOL -Bit ist optional, wird aber normalerweise empfohlen. Protokolle definieren, wie Pickle das Objekt serialisiert, wobei niedrigere Protokolle dazu tendieren, mit älteren Versionen von Python kompatibel zu sein.

Es ist erwähnenswert, zwei weitere Dinge:

Es gibt auch das Modul cPickle - geschrieben in C, um die Geschwindigkeit zu optimieren. Sie verwenden dies auf die gleiche Weise wie oben.

Pickle ist auch dafür bekannt, einige Unsicherheiten zu haben (es gibt Möglichkeiten, zu manipulieren, wie Beize ein Objekt deserialisiert, was Sie manipulieren können, um Python mehr oder weniger zu machen, was immer Sie wollen). Daher sollte diese Bibliothek nicht verwendet werden, wenn unbekannte Daten geöffnet werden. Im Extremfall können Sie eine sicherere Version wie spickle ausprobieren: Ссылка

Andere Bibliotheken, die ich empfehlen würde, sind json und marshall .

    
NDevox 05.05.2015 15:43
quelle
1

Ich habe einige Methoden erstellt (außer der numpy-Methode) und pickle / cPickle ist sehr langsam bei einfachen Datensätzen. Der schnellste Weg hängt davon ab, welche Art von Daten Sie speichern. Wenn Sie eine Liste von Strings und / oder Ganzzahlen speichern. Der schnellste Weg, den ich gesehen habe, ist es, ihn direkt in eine Datei zu schreiben, indem man eine for-Schleife und ',' verwendet. (...) lies ihn mit einer ähnlichen for-Schleife mit .split (',') wieder ein.

    
user3887940 19.06.2016 18:31
quelle
0

Sie können sich die Python-Objektserialisierung ansehen, pickle und cPickle . Ссылка

pickle.dumps(obj[, protocol]) Wenn der Protokollparameter weggelassen wird, wird Protokoll 0 verwendet. Wenn das Protokoll als negativer Wert oder HIGHEST_PROTOCOL angegeben wird, wird die höchste Protokollversion verwendet.

    
maow 05.05.2015 15:39
quelle

Tags und Links