Was ist die Schnellste Möglichkeit zum laden/speichern einer großen Liste in Python 2.7?
Was ist die Schnellste Möglichkeit zum laden/speichern einer großen Liste in Python 2.7? Ich entschuldige mich, wenn dies schon gefragt wurde, ich konnte Sie nicht finden, eine Antwort auf diese genaue Frage wenn ich gesucht...
Genauer gesagt, ich bin die Erprobung von Methoden für die Simulation von etwas, und ich muss vergleichen Sie das Ergebnis aus jeder Methode, die ich testen, um eine exakte Lösung. Ich habe ein Python-Skript erzeugt eine Liste von Werten, die der exakten Lösung, und ich will nicht re-berechnen jedes mal, wenn ich führen Sie eine neue simulation. So, ich möchte speichern Sie es irgendwo und laden Sie einfach die Lösung, statt re-computing es jedes mal, wenn ich will, um zu sehen, wie gut meine Simulationsergebnisse werden.
Ich auch nicht, müssen Sie die gespeicherte Datei lesbar sind. Ich muss nur in der Lage sein, um es zu laden in Python.
- Sie können die Gurke, es, docs.python.org/2/library/pickle.html , numpy.dump oder docs.scipy.org/doc/numpy/reference/generated/numpy.save.html, wenn Sie verwenden möchten numpy arrays
- Hmm, ok danke! Wissen Sie, wenn eine dieser Methoden ist deutlich schneller als die anderen? Ich Frage mich auch, ob es zu beschleunigen oder zu verlangsamen den code, wenn ich es ändern zum erzeugen der Referenz-Lösung in numpy-array-format statt einer Liste format.
- Wenn Sie besorgt über die Leistung vielleicht sollten Sie mit numpy zu tun alle Ihre Arbeit
- Ich bin nicht allzu besorgt über den Teil, wo ich produzieren die Lösung, denn das passiert nur einmal. Es ist nur das laden der Teil, der passieren wird, viele Male. Ich denke, ich Frage mich, ob Sie werden schneller geladen ein numpy-array im Gegensatz zu einer Liste?
- absolut, laden ein numpy-array wäre schneller als einem unpickling-Liste.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit np.laden und tolist ist deutlich schneller als jede andere Lösung:
In python 3 numpy ist weit effizienter, wenn Sie ein numpy-array:
Wenn Sie möchten, eine Liste wird es wieder schneller Aufruf von tolist und verwenden, np.Belastung:
pickle
odercPickle
?Als PadraicCunningham hat erwähnt, können Sie die Gurke der Liste.
dieser lädt die Liste in eine Datei.
Und um es zu entpacken:
Den
HIGHEST_PROTOCOL
bit ist optional, aber in der Regel wird empfohlen. Protokolle definieren, wie die Gurke wird serialise das Objekt mit der niedrigeren Protokolle tendenziell kompatibel mit älteren Versionen von Python.Es ist erwähnenswert noch zwei Dinge:
Gibt es auch die
cPickle
Modul geschrieben in C, die Optimierung der Geschwindigkeit. Sie verwenden diese in der gleichen Weise wie oben.Gurke ist auch bekannt, einige Unsicherheiten (gibt es Möglichkeiten der Manipulation, wie Gurke deserialises ein Objekt, das Sie manipulieren können, dass Python zu tun, mehr oder weniger, was Sie wollen). Als Ergebnis dieser Bibliothek sollte nicht verwendet werden, wenn Sie es öffnen unbekannter Daten. In extremen Fällen können Sie versuchen, eine sicherere version wie
spickle
: https://github.com/ershov/sPickleAnderen Bibliotheken, die ich empfehlen würde, auf der Suche sind
json
undmarshall
.cPickle
ist geschrieben inC
sind, wird es ein gutes Geschäft schneller als die meisten Dinge, die geschrieben sind inPython
(die Meisten Bibliotheken würden Sie verwenden). Also ich würde sagen, es ist eine gute Wette.Python
Objekte, ohne Sie zu manipulieren, in ein brauchbares format, mitpickle
/cPickle
bedeutet, dass Sie nicht zu tun haben, jede manipulation oder Analyse und können nur retten, wie Sie ist. All dies wird natürlich Faktor in der Verarbeitung Zeit.Ich habe einige Profilierung von vielen Methoden (mit Ausnahme der numpy-Methode) und pickle/cPickle ist sehr langsam, auf einfache Daten-sets. Der Schnellste Weg, hängt davon ab, welche Art von Daten Sie speichern. Wenn Sie speichern eine Liste von strings und/oder ganzen zahlen. Der Schnellste Weg, den ich gesehen habe ist, schreiben Sie einfach direkt in eine Datei mit einer for-Schleife und
','.join(...)
; Lesen Sie es zurück über eine ähnliche for-Schleife mit.split(',')
.Möchten Sie vielleicht werfen Sie einen Blick auf Python-Objekt-Serialisierung
pickle
undcPickle
http://pymotw.com/2/pickle/
pickle.dumps(obj[, protocol])
Wenn die Protokoll-parameter weggelassen wird, wird die Protokoll-0 verwendet. Wenn Sie das Protokoll angegeben ist als ein negativer Wert oder HIGHEST_PROTOCOL, die höchste Protokoll-version verwendet werden.