Hallo,
ich hab ein kleines Py-Progamm, dass eine Json-Datei liest und mit dem Inhalt via pygraphviz und layout('dot') eine png-Datei erzeugt. Mein Problem: ich rufe dieses Programm mehrfach auf und erhalte nicht immer das gleiche Bild. Wenn ich zusätzlich zu dem png-Output über write() einen dot-Output erzeuge, dann kann ich beobachten, dass immer dann, wenn die png-Datei anders aussieht, die Reihenfolge von subgraphen in der dot-Datei anders ist.
Meine Frage: gibt es Erfahrungen darüber, ob und wann die Ergebnisse von pygraphviz laufzeitabhängig anders sind?
Danke schon Mal
Beste Grüße
Humbalan
pygraphviz: nicht reproduzierbarer Output von dot
@Humbalan: Die Daten kommen ja anscheinend aus einem Wörterbuch und das hat keine geordnete Reihenfolge der Schlüssel/Wert-Paare, das heisst die kann bei jedem Programmlauf anders sein.
Danke für Eure Antworten.
Das finde ich jetzt erschrecken. Für meinen Auftrag ist es wichtig, dass ich reproduzierbare Ergebnisse bekomme. Wenn diese Aussage so stimmt, kann ich graphviz knicken. Daher die Frage an Dich, sparrow: Woher hast Du diese Information? Ist das Deine Erfahrung? Kann ich das irgendwo nachlesen? Vielleicht kann ich ja mit den entsprechenden Informationen den Graphviz-Input so beeinflussen, dass das Ergebniss konstant ist.
Beste Grüße
Humbalan
Das kann ich so nicht glauben. Ich beziehe mich auf https://docs.python.org/2/library/stdty ... dict.items, speziell auf den SatzBlackJack hat geschrieben:Die Daten kommen ja anscheinend aus einem Wörterbuch und das hat keine geordnete Reihenfolge der Schlüssel/Wert-Paare, das heisst die kann bei jedem Programmlauf anders sein.
Ich verstehe das so, dass bei einer festen Python-Version die Implementierung eines dict doch eine reproduzierbare Reihenfolge der Items erwartbar ist. Ich darf nur nicht erwarten, dass ich bei einem Update auf eine neue Pythonversion dasselbe Ergebniss bekomme. Das vorliegende Problem kann also m. E. damit nichts zu tun haben. Dennoch bin ich dankbar für den Hinweis, denn es kann ja später einmal ein Versionswechsel vorgenommen werden. Ich habe das Programm also entsprechend umgebaut, ich arbeite nun nicht mehr mit dicts sondern mit lists und namedtuples. Die Umwandlung des Json-Parser-Outputs in die entsprechenden Datentypen geschieht sortiert, so dass ich ganz sicher reproduzierbare Daten habe.Keys and values are listed in an arbitrary order which is non-random, varies across Python implementations, and depends on the dictionary’s history of insertions and deletions.
sparrow hat geschrieben:Das gerenderte Ergebnis von dot kann übrigens auch differieren wenn die Eingabe exakt gleich ist.
Das finde ich jetzt erschrecken. Für meinen Auftrag ist es wichtig, dass ich reproduzierbare Ergebnisse bekomme. Wenn diese Aussage so stimmt, kann ich graphviz knicken. Daher die Frage an Dich, sparrow: Woher hast Du diese Information? Ist das Deine Erfahrung? Kann ich das irgendwo nachlesen? Vielleicht kann ich ja mit den entsprechenden Informationen den Graphviz-Input so beeinflussen, dass das Ergebniss konstant ist.
Beste Grüße
Humbalan
@Humbalan: Die Reihenfolge hängt von den Hash-Werten der Schlüsselobjekte ab, und damit würde Deine Vermutung erfordern das der Hashwert eines gegebenen Wertes bei jedem Programmlauf gleich ist. Das ist definitiv nicht mehr so seit dem in CPython Zeichenketten einen Zufallswert in den Hash integrieren der bei jedem Programmstart ermittelt wird um gegen DOS-Attacken robuster zu sein die Hash-Kollisionen ausnutzen.
Bei `dot` selber weiss ich jetzt nicht 100% aber bei `neato`, `twopi`, und `fdp` werden zufällige Entscheidungen getroffen. Irgendwo gibt's dann immer eine Option um den Startwert des Zufallsgenerators auf einen festen Wert zu setzen.
Bei `dot` selber weiss ich jetzt nicht 100% aber bei `neato`, `twopi`, und `fdp` werden zufällige Entscheidungen getroffen. Irgendwo gibt's dann immer eine Option um den Startwert des Zufallsgenerators auf einen festen Wert zu setzen.
@BlackJack: Danke für die Klärung wg. Hashes und dicts. Das macht die Sache jetzt für mich klar. Danke auch für den Hinweis wg. neato und dem Zufallsstartwert. Werde mal suchen, ob ich damit irgendwie fündig werde.
Wünsche einen guten Rutsch
Beste Grüße
Humbalan
Wünsche einen guten Rutsch
Beste Grüße
Humbalan