2010-08-06 4 views
5

Ich versuche, die zugrunde liegende Struktur des Plotting-Codes (Matplotlib) anzupassen, die auf einem Timer aktualisiert wird, von Python-Listen für die Plot-Daten zu verwenden, um numpy Arrays zu verwenden. Ich möchte den Zeitschritt für die Handlung so weit wie möglich verringern können, und da die Daten in die Tausende von Punkten aufsteigen können, verliere ich schnell wertvolle Zeit, wenn ich nicht kann. Ich weiß, dass numpige Arrays für solche Dinge bevorzugt werden, aber ich habe Probleme herauszufinden, wann ich wie ein Python-Programmierer denken muss und wann ich wie ein C++ - Programmierer denken muss, um meine Effizienz beim Speicherzugriff zu maximieren.Wie hängt Pythonic Garbage Collection mit numpy Array an und löscht?

In den Dokumenten von scipy.org wird für die Funktion append() angegeben, dass eine Kopie der angehängten Arrays zurückgegeben wird. Werden all diese Kopien richtig gesammelt? Zum Beispiel:

import numpy as np 

a = np.arange(10) 
a = np.append(a,10) 
print a

Dies ist meine Lektüre von dem, was auf der C vorgeht ++ - Ebene, aber wenn ich wusste, was ich rede, ich würde nicht die Frage stellen, so bitte korrigieren Sie mich, wenn ich 'Ich liege falsch! = P

Zuerst wird ein Block von 10 Ganzzahlen zugewiesen, und das Symbol a zeigt auf den Anfang dieses Blocks. Dann wird ein neuer Block von 11 ganzen Zahlen zugewiesen, wobei insgesamt 21 Bits (84 Bytes) verwendet werden. Dann wird der a-Zeiger zum Anfang des 11-int-Blocks bewegt. Meine Vermutung ist, dass dies dazu führen würde, dass der Müllsammlungsalgorithmus den Referenzzählwert des 10-int-Blocks auf Null dekrementiert und die Zuweisung rückgängig macht. Ist das richtig? Wenn nicht, wie stelle ich sicher, dass ich beim Anhängen keinen Overhead erzeuge?

Ich bin auch nicht sicher, wie man ein numpy Array richtig löscht, wenn ich es benutze. Ich habe einen Reset-Knopf auf meinen Plots, der einfach alle Daten löscht und von vorne beginnt. Als ich Listen hatte, wurde dies mit del data[:] gemacht. Gibt es eine äquivalente Funktion für numpy Arrays? Oder sollte ich einfach data = np.array ([]) sagen und auf den Garbage Collector zählen, um die Arbeit für mich zu erledigen?

Antwort

10

Der Punkt der automatischen Speicherverwaltung ist, dass Sie nicht darüber nachdenken. In dem Code, den Sie geschrieben haben, werden die Kopien sauber gesammelt (es ist fast unmöglich, Pythons Speicherverwaltung zu verwirren). Da np.append jedoch nicht direkt vorhanden ist, erstellt der Code ein neues Array im Speicher (enthält die Verkettung a und 10) und dann wird die Variable a aktualisiert, um auf dieses neue Array zu zeigen. Da a jetzt nicht mehr auf das ursprüngliche Array verweist, das einen Refcount von 1 hatte, wird sein Refcount auf 0 dekrementiert und automatisch bereinigt. Sie können verwenden, um eine vollständige Bereinigung zu erzwingen.

Pythons Stärke liegt nicht in der Feinabstimmung des Speicherzugriffs, obwohl es möglich ist, sie zu optimieren. Sie sind wahrscheinlich am besten sortiert Vorbelegung a (unter Verwendung z. B. a = np.zeros(<size>)); Wenn Sie feineres Tuning brauchen, wird es etwas haarig. Sie können einen Blick auf die Cython + Numpy tutorial für eine sehr übersichtliche und einfache Möglichkeit zur Integration von C mit Python für die Effizienz werfen.

Variablen in Python zeigen nur auf den Speicherort ihres Inhalts; Sie können del jede Variable und es wird die Referenzzahl seines Ziels um eins verringern. Das Ziel wird automatisch bereinigt, wenn der Referenzzähler Null erreicht. Die Moral davon ist, mach dir keine Sorgen um dein Gedächtnis aufzuräumen. Es wird automatisch passieren.

+0

Also im Grunde muss ich mich entspannen. =) Dank für die Klarstellung, dachte ich, dass so die Dinge funktionierten, aber ich war nicht 100% klar darauf. – pr0crastin8r