Garbage Collector ausschalten

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
Butterblum
User
Beiträge: 6
Registriert: Donnerstag 27. November 2014, 13:36

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
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.
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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
Wie löschst Du sie denn oder was bedeutet für Dich "löschen"?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Gleichbleibende Bedingungen wirst du schon nicht wegen dem Betriebssystem gewährleisten können. Normalerweise mittelt man seine Ergebnisse oder nimmt den Median dafür.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Butterblum
User
Beiträge: 6
Registriert: Donnerstag 27. November 2014, 13:36

Hyperion hat geschrieben:Wie löschst Du sie denn oder was bedeutet für Dich "löschen"?
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.
darktrym 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.
Das mach ich auch, ich messe mehere (hundert) mal und ermittle dann den besten Wert

Die Idee habe ich aus einem Python Buch von Gallileo Computing
http://www5.in.tum.de/~/ferstlc/python_ ... 5bd840b9c7
Erste Hinweisbox
nezzcarth
User
Beiträge: 1792
Registriert: Samstag 16. April 2011, 12:47

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.
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:
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.
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
Antworten