2015-08-10 3 views
5

Ich habe einige Python-Code, wo gc.collect() scheint eine Menge Speicher freizugeben. Angesichts der Referenzzählweise von Python bin ich geneigt zu glauben, dass mein Programm viele zyklische Referenzen enthält. Da einige Datenstrukturen ziemlich groß sind, möchte ich schwache Referenzen einführen. Jetzt muss ich die Zirkelverweise finden, nachdem ich einige der offensichtlichen gefunden habe, Ich frage mich, ob man Zirkelverweise und die Objekte, die den Ring bilden, explizit erkennen kann. Bis jetzt habe ich nur Tutorials gesehen, wie man gc.collect et. al.Wie finde ich heraus, welche spezifischen zirkulären Referenzen in Code vorhanden sind

+0

Haben diese Objekte benutzerdefinierte '__del__' Methoden? – Cyphase

+0

Sie können das [objgraph] (http://mg.pov.lt/objgraph/) Paket nützlich finden. Es wird eine Visualisierung der Referenzen zwischen Objekten erstellt. [Hier ist ein Blog-Post über zirkuläre Referenzen und objgraph.] (Http://engineering.hearsaysocial.com/2013/06/16/circular-references-in-python/) – Cyphase

+0

Ich werde auch nur erwähnen, dass im Idealfall Sie würden Entfernen Sie diese Zirkelbezüge wenn möglich zuerst, anstatt zu versuchen, sie zu umgehen :). – Cyphase

Antwort

0

Wenn Sie die Methoden __del__ nicht überschreiben, sollten Sie sich keine Gedanken über zirkuläre Abhängigkeiten machen, da Python in der Lage ist, mit ihnen richtig umzugehen.

+0

... bis Sie versuchen, Pythons Multiprocessing zu verwenden und Ihre Objekte nicht mehr pickle . IMO ist es eine gute Idee darüber nachzudenken, wie zyklische Referenzen beim Entwerfen einer Anwendung vermieden werden können, da es mehrere Türen offen lässt, um die Leistung zu einem späteren Zeitpunkt zu optimieren. Das ist * nicht * dasselbe wie vorzeitige Optimierung. –

Verwandte Themen