Originaltext: https://mp.weixin.qq.com/s/TStrHMbgDjPIsXaPK6-VSQ
1 Dill Einführung
pickle/dill
Es kann zum Speichern der meisten Python-Datenformate wie Objekte verwendet werden. Pickle kann keine lambda
Funktionen, serialisierten Objekte usw. speichern, aber dill
es kann gespeichert werden.
Die Verwendung von Gurke und Dill ist gleich.
Dill-Eigenschaften:
1) Folgende Standardsorten können gebeizt werden
- none, type, bool, int, long, float, complex, str, unicode,
- Tupel, Liste, Diktat, Datei, Puffer, integriert,
- sowohl alte als auch neue Stilklassen,
- Instanzen alter und neuer Stilklassen,
- Set, Frozenset, Array, Funktionen, Ausnahmen
2) Sie können auch einige einzigartige Sorten einlegen
- Funktionen mit Erträgen, verschachtelten Funktionen, Lambdas,
- Zelle, Methode, ungebundene Methode, Modul, Code, Methodenwrapper,
- dictproxy, methoddescriptor, getsetdescriptor, memberdescriptor,
- Wrapperdeskriptor, Xrange, Slice,
- nicht implementiert, Auslassungspunkte, beenden
3) Folgende Sorten können jedoch vorerst nicht gebeizt werden:
- Rahmen, Generator, Traceback
4) Weitere Funktionen von Dill
- Speichern und laden Sie Python-Interpreter-Sitzungen
- Speichern und extrahieren Sie den Quellcode aus Funktionen und Klassen
- Beizfehler interaktiv diagnostizieren
Als nächstes stellen wir verschiedene Verwendungsmöglichkeiten von Dill vor.
2 Anonyme Funktion speichern
# !pip install dill
import dill
# 保存匿名函数
squared = lambda x: x**2
dill.loads(dill.dumps(squared))(3)
# 9
3 Quellcode anzeigen
# 保存源码
import dill.source
print(dill.source.getsource(squared))
Melden Sie es in ipython OSError: could not extract source code
und ändern Sie es in die folgende Form:
code=dill.source.getsource(dill.detect.code(squared))
print(code)
# squared = lambda x: x**2
4 Speichern Sie den Klassendatensatz, DataLoader
Dies beschleunigt die Datenvorverarbeitung.
# 保存class
from torch.utils.data import TensorDataset, DataLoader
import torch
from sklearn.datasets import make_classification
data, target = make_classification()
# data.shape, target.shape
# ((100, 20), (100,))
batch_size=10
dataset = TensorDataset(torch.from_numpy(data), torch.from_numpy(target))
dataloader = DataLoader(dataset, shuffle=False, drop_last=True, batch_size=batch_size)
Daten speichern:
dill.dump(dataset, './dataset_save.pkl')
dill.dump(dataloader, './dataloader_save.pkl')
Direktes Speichern führt zu einem Fehler:TypeError: file must have a 'write' attribute
Speichern Sie es einfach wie folgt:
with open('./dataset_save.pkl','wb') as f:
dill.dump(dataset, f)
with open('./dataloader_save.pkl','wb') as f:
dill.dump(dataloader, f)
Daten herunterladen:
with open('./dataset_save.pkl','rb') as f:
dataset_save = dill.load(f)
with open('./dataloader_save.pkl','rb') as f:
dataloader_save = dill.load(f)
Datenvergleich:
x, y = next(iter(dataloader))
x_save, y_save = next(iter(dataloader_save))
torch.equal(x, x_save), torch.equal(y, y_save)
# (True, True)