Objekte speichern, weil Instanzierung so rechenaufwendig ist

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

Hallihallo,

habe eine eigene Klasse geschrieben, die zur Instanzierung ein paar Parametern braucht und dann eine ganze Menge ausrechnet und als Attribute speichert. Soweit so gut. Als nächstes erzeuge ich aber eine ganze Reihe dieser Instanzen, indem ich einen grossen Bereich von Parametern abdecke. Bis Python damit fertig ist, und mir die Liste der Objekte zurück gibt vergehen rund 6 Minuten. Das hat bei mir die Frage aufgeworfen: wie kann man Objekte in einer Datei speichern, um so beim nächsten Start von Python auf diese Zugriff zu haben, ohne erneute Instanzierungen durchführen zu müssen?

Ist bestimmt eine Frage der Kategorie FAQ.

Danke,

4bit.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Richtig. Es gibt ``pickle``. Allerdings muss auch das wieder eingelesen werden.

Ich wuerde aber sagen, dass dein Problem eher bei Ansatz/Implementierung liegt bzw es einfach so lange dauert.
4bit
User
Beiträge: 113
Registriert: Dienstag 5. Mai 2009, 11:27

möchte ja garnicht behaupten, daß die Abläufe obtimal in Bezug auf Geschwindigkeit geschrieben sind, aber es geht auch wirklich um ein rechenaufwendiges Gebiet: Graphentheorie. Genauer gesagt habe ich eine Klasse geschrieben, die mit ein paar knappen Anweisungen (besagte Parameter) einen gerichteten Graph erzeugt. Ziel ist es eine Aussage wie diese zu treffen: Alle erzeugten Graphen der Parametermenge So-und-so (hoffentlich groß) erzeugen isomorphe Graphen.
Und diese vielen Isomorphie-Prüfungen schlagen eben ein bischen auf die Geschwindigkeit. Damit es nicht allzu lange dauert habe ich mir ein paar Tricks überlegt, um zu große Permutationen zu vermeiden. Damit diese Tricks funktionieren muss ich aber einmalig ein paar Hilfe-leistende-Mengen für jeden Graphen erzeugen. Und das dauert eben bei der Instanzierung.

Also angenommen ich besitzte die ausgeklügelsten Anweisungen diese Graphen zu erzeugen und es dauert immernoch zu lange... Gibts da nicht einen kurzen Python Befehl der ein einmal erzeugtes Python-Objekt speichert? Denke da an Matlabs Art und Weise Variablen zu speichern.

4biut.
lunar

Du wurdest doch schon auf Pickle verwiesen, dass dürfte für deine Zwecke genau das richtige sein.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Die Frage ist, ob Du die Objekte nun wirklich im Speicher benötigst, insbesondere ob Du wirklich alle zu jeder Zeit brauchst. Was Du meinst ist bestimmte eine Art Funktion, die einen Datenblock von der Festplatte direkt in den RAM schreibt und schon die Python-Objekte hat. Aber sowas wirst Du nicht finden.
Punkten kannst Du vielleicht mit kompilierten Modulen, die die Rechenarbeit der Isomorphieprüfungen für Dich übernehmen. Weiß nicht, ob in SciPy da etwas bei ist.

Und wenn die Generierung von Hilfsobjekten tatsächlich 6 Minuten dauert, dann hast Du entweder einen verdammt großen Arbeitsspeicher oder Du kannst bei der Generierung einiges optimieren. ;-)
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

cofi hat geschrieben:Richtig. Es gibt ``pickle``. Allerdings muss auch das wieder eingelesen werden.

Ich wuerde aber sagen, dass dein Problem eher bei Ansatz/Implementierung liegt bzw es einfach so lange dauert.
Was ist mit cPickle?
BlackJack

@Dav1d: Was soll damit sein? Das ist ein Modul in der Standardbibliothek von CPython.

Solange das "normale" `pickle` nicht mess- und spürbar zu langsam ist, lasse ich persönlich die Finger davon.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

cPickle ist doch auch bei der 'normalen' Python Version dabei

und sry ich hab falsch gelesen -.-, ich dachte cofi meint, dass das pickle modul zu langsam ist.

mfg
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Dav1d hat geschrieben:cPickle ist doch auch bei der 'normalen' Python Version dabei
Was ist bei dir bitte dann die "normale" Python Version?
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

SchneiderWeisse hat geschrieben:
Dav1d hat geschrieben:cPickle ist doch auch bei der 'normalen' Python Version dabei
Was ist bei dir bitte dann die "normale" Python Version?
Verwirr ihn doch nicht! :p
CPython ist "normal" @Dav1d
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

ok, verwende lieber pickle :o
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dav1d hat geschrieben:ok, verwende lieber pickle :o

Code: Alles auswählen

try:
	import cPickle as pickle
except ImportError:
	import pickle
Da beide die gleiche API anbieten kein Problem.
Antworten