Wie funktioniert Pythonic garbage collection mit numpy-array-fügt und löscht?
Ich versuche zur Anpassung der zugrunde liegenden Struktur des Zeichnens-code (matplotlib), die aktualisiert wird, auf einen timer, um zu gehen von der Verwendung von Python-Listen für die Darstellung von Daten zu verwenden numpy-arrays. Ich möchte in der Lage sein, um den unteren der Zeit Schritt für die Handlung, so viel wie möglich, und da die Daten bis in die Tausende von Punkte, ich verliere wertvolle Zeit schnell, wenn ich nicht kann. Ich weiß, dass numpy-arrays sind bevorzugt für diese Art der Sache, aber ich habe Schwierigkeiten, herauszufinden, wenn ich denke, wie ein Python-Programmierer, und wenn ich denke, wie ein C++ - Programmierer optimale Effizienz der Speicher-Zugriff.
Heißt es in der scipy.org docs für die append () - Funktion, die es gibt eine Kopie des arrays angehängt, zusammen. All diese Kopien bekommen, garbage Collection-richtig? Zum Beispiel:
import numpy as np
a = np.arange(10)
a = np.append(a,10)
print a
Dies ist meine Lektüre von was ist Los auf der C++-Ebene, aber wenn ich wüsste, was ich Rede, würde ich nicht Fragen, also bitte korrigieren Sie mich, wenn ich falsch bin! =P
Zuerst ein block mit 10 Ganzzahlen zugewiesen bekommt, und das symbol zeigt auf den Anfang des Blocks. Dann einen neuen block 11 ganze zahlen zugeordnet, für die insgesamt 21 ints (84 bytes) verwendet wird. Dann wird der Zeiger bewegt wird, um den start der 11-int block. Meine Vermutung ist, dass dadurch die garbage-collection-Algorithmus Dekrementieren der Verweis für die Zählung der 10-int-block auf null und de-Zuweisung von it. Ist das richtig? Wenn nicht, wie kann ich dafür sorgen, dass ich nicht erstellen, overhead beim Anhängen?
Ich bin auch nicht sicher, wie Sie Sie richtig löschen ein numpy-array, wenn ich fertig bin, es zu benutzen. Ich habe eine reset-Taste auf meinem Grundstücke, die nur spült alle Daten und startet über. Wenn ich hatte Listen, dies war mit del data[:]
. Gibt es eine entsprechende Funktion zum numpy-arrays? Oder sollte ich einfach sagen, data = np.array([]) und zählen Sie auf, dass der garbage collector die Arbeit zu tun für mich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Punkt der automatischen Speicherverwaltung ist, dass man gar nicht darüber nachdenken. In dem code, den Sie schrieb, die Exemplare werden von der garbage Collection in Ordnung (es ist fast unmöglich, zu verwechseln Python ' s memory management). Da jedoch
np.append
ist nicht in-place, der code erstellt ein neues array im Speicher (mit der Verkettung vona
und10
) und dann die variablea
wird aktualisiert, um auf dieses neue array. Daa
jetzt nicht mehr Punkte, um das ursprüngliche array, das hatte einen refcount von 1, dessen refcount dekrementiert auf 0 und es wird aufgeräumt werden automatisch. Sie könnengc.sammeln
zu zwingen, eine vollständige Bereinigung.Python ' s Stärke liegt nicht in der fine-tuning memory access, obwohl es möglich ist, zu optimieren. Sie sind wahrscheinlich am besten sortiert pre-allocating
a
(mit z.B.a = np.zeros( <size> )
); wenn Sie eine feinere Einstellung, als dass es beginnt, um ein wenig haarig. Sie konnte einen Blick auf die Cython + Numpy tutorial für eine sehr schöne und einfache Möglichkeit für die Integration von C mit Python für Effizienz.Variablen in Python einfach auf die Stelle, wo Ihr Inhalt gespeichert werden; Sie können
del
alle Variablen, und es verringert den Referenzzähler von seinem Ziel von einem. Das Ziel wird automatisch gereinigt nach seinen Referenzzähler null schlägt. Die moral von diesem ist, Mach dir keine sorgen über das Aufräumen Ihres Speichers. Es wird automatisch geschehen.