Seite 1 von 1

Speichernutzung mit ndarray-Variablen

Verfasst: Sonntag 26. Juli 2009, 21:17
von booth
Hallo,

ich habe ein Programm geschrieben, dass ungefaehr so aussieht:

Code: Alles auswählen

 from numpy import *

# Funktion
def func(inA, a0, a1, a2):
tempA = zeros((10,3))
for i in range(0,10):
 tempA[i,:] = array([a0, a1, a2])

return append(inA, tempA, 0)

# Programm
inA = zeros((1,3))
inA = func(inA, 1, 2, 3)
inA = func(inA, 3, 2, 1)
# ... usw. usf.
print inA # bzw. irgendwas Sinnvolles
In Echt ist das natuerlich etwas sinnvoller.
Meine Frage ist nun ob jeder Aufruf von func() eine neue Variable inA im Speicher anlegt, ich also nachdem ich 100x (oder so) func() mit einer immer groesserwerdenen Variablen inA den kompletten Speicher zumuelle. In meinem richtigen Programm kann inA locker einige 10.000 Zeilen und 9 Spalten haben. Die Variable tempA wird meines Wissens nach "geloescht" wenn die Funktion durchgelaufen ist, oder?

vG, U.

Verfasst: Sonntag 26. Juli 2009, 21:44
von sma
Unter der Annahme das `zeros` ein neues Array anlegt und `append` irgendwas mit Arrays macht und auch eines zurückgibt, dann erzeugt jeder Aufruf von `func` neue Arrays. Ist aber wahrscheinlich egal, weil die alten von Python automatisch weggeräumt werden, wenn sie nicht mehr benutzt (d.h. irgendwie referenziert) werden.

Du spricht von Variablen, die angelegt werden, meinst aber wahrscheinlich die Arrays, die in den Variablen (die ja nur Namen für Objekte sind) stecken. Variablen werden auch nicht wirklich gelöscht. Ich würde eher davon sprechen, dass sie aufhören zu existieren. Das so treffend benannte `tempA` ist eine lokale Variable die nur solange existiert, wie die Funktion `func` aktiviert ist, d.h. gerade aufgerufen wird. Gleiches gilt für die Parameter `inA` und `a0` bis `a2`.

Stefan

Verfasst: Sonntag 26. Juli 2009, 21:56
von booth
sma hat geschrieben:Unter der Annahme das `zeros` ein neues Array anlegt und `append` irgendwas mit Arrays macht und auch eines zurückgibt, dann erzeugt jeder Aufruf von `func` neue Arrays. Ist aber wahrscheinlich egal, weil die alten von Python automatisch weggeräumt werden, wenn sie nicht mehr benutzt (d.h. irgendwie referenziert) werden.
numpy.zeros() erzeugt ein Array mit Nullen (floats). In diesem Beispiel eine Zeile, drei Spalten. numpy.append() haengt an ein Array ein anderes an. In diesem Beispiel in Richtung der Zeilen (0).

Das inA nur ein Name ist wusste ich, dass ist genau das Problem :)
Wenn inA immer die Speicheradresse fuer ein neues Array bekommt, dann bleibt das alte Array im Speicher und hat fuer Python keinen Namen mehr. Ich bin mir da nicht sicher gewesen ob dieser Speicher von anderen Programmen oder Python benutzt werden kann solange Python noch laeuft (was in meinem Fall sehr lange sein kann, da ich Python nicht staendig neu starten moechte).

Vielleicht stelle ich mir das zu einfach vor und die Entwickler haben mitgedacht und dafuer eine Loesung eingebaut.

vG, U.

Verfasst: Sonntag 26. Juli 2009, 22:12
von Darii
Du darfst im Allgemeinen schon davon ausgehen, dass die Entwickler des entsprechenden Pakets keinen Mist gebaut haben, und sich um die Verwaltung des Speichers gekümmert haben.