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.
Objekte speichern, weil Instanzierung so rechenaufwendig ist
- 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.
Ich wuerde aber sagen, dass dein Problem eher bei Ansatz/Implementierung liegt bzw es einfach so lange dauert.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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.
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.
Du wurdest doch schon auf Pickle verwiesen, dass dürfte für deine Zwecke genau das richtige sein.
- 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.
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 ...
Was ist mit cPickle?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.
@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.
Solange das "normale" `pickle` nicht mess- und spürbar zu langsam ist, lasse ich persönlich die Finger davon.
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
und sry ich hab falsch gelesen -.-, ich dachte cofi meint, dass das pickle modul zu langsam ist.
mfg
Verwirr ihn doch nicht! :pSchneiderWeisse hat geschrieben:Was ist bei dir bitte dann die "normale" Python Version?Dav1d hat geschrieben:cPickle ist doch auch bei der 'normalen' Python Version dabei
CPython ist "normal" @Dav1d
ok, verwende lieber pickle
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Dav1d hat geschrieben:ok, verwende lieber pickle
Code: Alles auswählen
try:
import cPickle as pickle
except ImportError:
import pickle
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte