Ich habe verstanden, dass Python-Beizen eine Möglichkeit ist, ein Python-Objekt so zu speichern, dass die Objektprogrammierung berücksichtigt wird - anders als bei einer Ausgabe, die in eine txt-Datei oder eine DB geschrieben wurde.
Haben Sie weitere Details oder Referenzen zu folgenden Punkten:
- Wo werden eingelegte Gegenstände "gelagert"?
- Warum ist das Beibehalten der Objektdarstellung mehr als beispielsweise das Speichern in der Datenbank?
- Kann ich eingelegte Objekte von einer Python-Shell-Sitzung zu einer anderen abrufen?
- Haben Sie wichtige Beispiele, wenn die Serialisierung nützlich ist?
- Bedeutet Serialisierung mit Pickle, dass Daten komprimiert werden?
Mit anderen Worten, ich suche nach einem Dokument zum Beizen - Python.doc erklärt, wie man Beizen implementiert, scheint aber nicht auf Details über die Verwendung und die Notwendigkeit der Serialisierung einzugehen.
python
serialization
pickle
kiriloff
quelle
quelle
Antworten:
Das Beizen ist eine Möglichkeit, ein Python-Objekt (Liste, Diktat usw.) in einen Zeichenstrom umzuwandeln. Die Idee ist, dass dieser Zeichenstrom alle Informationen enthält, die zum Rekonstruieren des Objekts in einem anderen Python-Skript erforderlich sind.
Wo die eingelegten Informationen gespeichert sind, würde man normalerweise tun:
Das würde die eingelegte Version unseres
var
Diktats in der 'Dateinamen'-Datei speichern. In einem anderen Skript können Sie dann aus dieser Datei in eine Variable laden und das Wörterbuch wird neu erstellt:Eine andere Verwendung zum Beizen ist, wenn Sie dieses Wörterbuch über ein Netzwerk übertragen müssen (möglicherweise mit Sockets oder Ähnlichem). Sie müssen es zuerst in einen Zeichenstrom konvertieren und können es dann über eine Socket-Verbindung senden.
Außerdem gibt es hier keine nennenswerte "Komprimierung" ... es ist nur eine Möglichkeit, von einer Darstellung (im RAM) in eine andere (im "Text") zu konvertieren.
About.com hat eine schöne Einführung von Beizen hier .
quelle
with open('filename') as f: ...
with open(filename, 'wb') as f: ...
oder Sie könnten nicht in die Datei schreiben.pickle
ein Wörterbuch über ein Netzwerk zu übertragen (json könnte hier besser sein). In seltenen Fällen kann es jedoch nützlich sein, zmultiprocessing
. B. ein Modul.protocol=0
(Standard in Python2.x) kann mit Dateien verwendet werden, die im Textmodus geöffnet sind.Beizen ist für verteiltes und paralleles Rechnen unbedingt erforderlich.
Angenommen , Sie möchten eine parallele Kartenreduzierung mit
multiprocessing
(oder über Clusterknoten mit Pyina ) durchführen, dann müssen Sie sicherstellen, dass die Funktion, die Sie über die parallelen Ressourcen hinweg zuordnen möchten , aktiviert wird. Wenn es nicht eingelegt wird, können Sie es nicht an die anderen Ressourcen eines anderen Prozesses, Computers usw. senden. Siehe auch hier für ein gutes Beispiel.Dazu verwende ich Dill , der fast alles in Python serialisieren kann. Dill hat auch einige gute Tools, die Ihnen helfen, zu verstehen, warum Ihr Beizen fehlschlägt, wenn Ihr Code fehlschlägt.
Und ja, die Benutzer verwenden die Auswahl, um den Status einer Berechnung oder Ihrer Ipython- Sitzung oder was auch immer zu speichern . Sie können Pickles Pickler und UnPickler auch erweitern, um die Komprimierung mit
bz2
oder durchzuführen,gzip
wenn Sie möchten .quelle
Ich finde es besonders nützlich bei großen und komplexen benutzerdefinierten Klassen. In einem bestimmten Beispiel, an das ich denke, war das "Sammeln" der Informationen (aus einer Datenbank) zum Erstellen der Klasse bereits die halbe Miete. Dann können diese in der Klasse gespeicherten Informationen zur Laufzeit vom Benutzer geändert werden.
Sie könnten eine andere Gruppe von Tabellen in der Datenbank haben und eine andere Funktion schreiben, um alles Gespeicherte durchzugehen und in die neuen Datenbanktabellen zu schreiben. Dann müssten Sie eine weitere Funktion schreiben, um etwas zu laden, das durch Einlesen all dieser Informationen gespeichert wurde.
Alternativ können Sie die gesamte Klasse unverändert auswählen und diese dann in einem einzelnen Feld in der Datenbank speichern. Wenn Sie es dann wieder laden, wird alles auf einmal wieder geladen, wie es zuvor war. Dies kann beim Speichern und Abrufen komplizierter Klassen viel Zeit und Code sparen.
quelle
es ist eine Art Serialisierung. Verwenden Sie cPickle, es ist viel schneller als Pickle.
quelle