Hallo zusammen,
ich hätte eine Frage und vieleicht kann mir ja jemand von euch helfen. Ich habe in einem Python Buch gelesen, dass man, um bei einer Laufzeitmessung mit timeit unverfälschtere Ergebnisse zu bekommen, den Garbage Collector ausschalten könne. Leider steht da nicht wie.
Hat da jemand eine Ahnung wie das geht? In den Eclipse Einstellungen meines Py Interpreters habe ich leider nix dazu gefunden.
Vielen Dank schonmal
Garbage Collector ausschalten
-
BlackJack
@Butterblum: Ich verstehe die Logik dahinter nicht. Man will doch messen wie schnell etwas im realen Einsatz ist und da ist die Speicherbereinigung ja aktiv. Was nützen einem Laufzeiten bei denen ein Teil der Arbeit nicht gemacht wird?
Ansonsten hilft ein Blick in das Inhaltsverzeichnis der Standardbibliothek und der Suche nach dem Wort „garbage collection” in dem Inhaltsverzeichnis um zur Dokumentation des `gc`-Moduls zu gelangen.
Ansonsten hilft ein Blick in das Inhaltsverzeichnis der Standardbibliothek und der Suche nach dem Wort „garbage collection” in dem Inhaltsverzeichnis um zur Dokumentation des `gc`-Moduls zu gelangen.
-
Butterblum
- User
- Beiträge: 6
- Registriert: Donnerstag 27. November 2014, 13:36
Der Grund warum ich ihn ausschalten will ist der, dass ich versuche möglichst gleichbleibende Bedinnungen zu bekommen. Ich vergleiche verschiedene Datenstrukturen in dem ich sie mit Daten fülle und sie wieder lösche und dabei die Zeit messe. Wenn der GC bei Messung 1
Schwerstarbeit leistet und bei Messung 2 gar nicht dann "verfälscht" das ein wenig das Ergebnis, da ich allgemeinere und plattformunabhängigere AUssagen treffen will
Aber Danke für den Tip. Ich schau es mir mal an
Schwerstarbeit leistet und bei Messung 2 gar nicht dann "verfälscht" das ein wenig das Ergebnis, da ich allgemeinere und plattformunabhängigere AUssagen treffen will
Aber Danke für den Tip. Ich schau es mir mal an
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Wie löschst Du sie denn oder was bedeutet für Dich "löschen"?Butterblum hat geschrieben:Ich vergleiche verschiedene Datenstrukturen in dem ich sie mit Daten fülle und sie wieder lösche und dabei die Zeit messe.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Wenn der Garbage Collector aus ist stellt sich dann allerdings die Frage, was du überhaupt noch misst. Denn mit der Realität hat die ganze Sache dann nichts mehr zu tun. Letztendlich optimierst du dann nur darauf, dass die Kosten währen der Berechnung gering sind, am Ende prinzipiell aber in ungeahnte Höhen steigen. Das Aufräumen gehört bei Python eben mit zur Berechnung dazu.
Damit dir der GC, andere Prozesse oder der Scheduler deines Betriebssystems nicht deine ganze Messung versauen, solltest du die Messung auch häufiger durchführen und dann mitteln, den Median bestimmen oder das Minimum verwenden. Dann hast du eine halbwegs zuverlässige Aussage.
Damit dir der GC, andere Prozesse oder der Scheduler deines Betriebssystems nicht deine ganze Messung versauen, solltest du die Messung auch häufiger durchführen und dann mitteln, den Median bestimmen oder das Minimum verwenden. Dann hast du eine halbwegs zuverlässige Aussage.
Das Leben ist wie ein Tennisball.
-
Butterblum
- User
- Beiträge: 6
- Registriert: Donnerstag 27. November 2014, 13:36
Löschen heisst, ich trenne den Verweis bzw. den Link zu einem Element. Ohne GC ist das Element nicht wirklich gelöscht, das ist schon klar. Aber ich will wie gesagt allgemeinere Aussagen treffen.Hyperion hat geschrieben:Wie löschst Du sie denn oder was bedeutet für Dich "löschen"?
Das mach ich auch, ich messe mehere (hundert) mal und ermittle dann den besten Wertdarktrym hat geschrieben:Damit dir der GC, andere Prozesse oder der Scheduler deines Betriebssystems nicht deine ganze Messung versauen, solltest du die Messung auch häufiger durchführen und dann mitteln, den Median bestimmen oder das Minimum verwenden. Dann hast du eine halbwegs zuverlässige Aussage.
Die Idee habe ich aus einem Python Buch von Gallileo Computing
http://www5.in.tum.de/~/ferstlc/python_ ... 5bd840b9c7
Erste Hinweisbox
Ich verstehe die Passage, die du verlinkt hast so, dass timeit das bereits selbst macht (und dich wiederrum so, dass du wissen möchtest, wie man das für timeit ausschaltet).Butterblum hat geschrieben:Hallo zusammen,
Ich habe in einem Python Buch gelesen, dass man, um bei einer Laufzeitmessung mit timeit unverfälschtere Ergebnisse zu bekommen, den Garbage Collector ausschalten könne. Leider steht da nicht wie.
Ähnlich äußert sich die Doku:
https://docs.python.org/2/library/timeit.html#timeit.Timer.timeit hat geschrieben: By default, timeit() temporarily turns off garbage collection during the timing. The advantage of this approach is that it makes independent timings more comparable. This disadvantage is that GC may be an important component of the performance of the function being measured. If so, GC can be re-enabled as the first statement in the setup string.
-
BlackJack
@Butterblum: Das Objekt kann auch ohne GC gelöscht werden. Zumindest bei CPython wird der GC nur für Objekte verwendet bei denen eine zyklische Abhängigkeit verhindert das der Referenzzähler des Objekts auf 0 fallen kann.
Ich halte den Hinweis für Unsinn. Weder der Hinweis noch Du haben bisher begründet *warum* man Messergebnisse haben möchte die am Ende nichts mit dem realen Laufzeitverhalten zu tun haben werden. Wenn die Schwankungen in der Laufzeit die durch den GC verursacht werden so gross sind, dass sie Unterschiede in Algorithmen überdecken, dann haben diese Unterschiede schlicht keine praktische Relevanz weil man sie in der Realität gar nicht beobachten kann.
Und auch das abschalten des GCs hat ja Nebenwirkungen. Es kann zum Beispiel dazu kommen dass deutlich mehr Speicher verbraucht wird und damit mehr Cache-Misses entstehen und der Code dadurch langsamer wird.
Ich halte den Hinweis für Unsinn. Weder der Hinweis noch Du haben bisher begründet *warum* man Messergebnisse haben möchte die am Ende nichts mit dem realen Laufzeitverhalten zu tun haben werden. Wenn die Schwankungen in der Laufzeit die durch den GC verursacht werden so gross sind, dass sie Unterschiede in Algorithmen überdecken, dann haben diese Unterschiede schlicht keine praktische Relevanz weil man sie in der Realität gar nicht beobachten kann.
Und auch das abschalten des GCs hat ja Nebenwirkungen. Es kann zum Beispiel dazu kommen dass deutlich mehr Speicher verbraucht wird und damit mehr Cache-Misses entstehen und der Code dadurch langsamer wird.
-
Butterblum
- User
- Beiträge: 6
- Registriert: Donnerstag 27. November 2014, 13:36
Butterblum hat geschrieben: Ich verstehe die Passage, die du verlinkt hast so, dass timeit das bereits selbst macht (und dich wiederrum so, dass du wissen möchtest, wie man das für timeit ausschaltet).
Ähnlich äußert sich die Doku:
ah...das hatte ich nicht gerafft, ich dachte ich muss das explizit ausschalten.
Danke für den Hinweis, damit ist mir schon sehr geholfen
