Speichernutzung mit ndarray-Variablen

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
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
booth
User
Beiträge: 44
Registriert: Mittwoch 31. Oktober 2007, 21:30
Wohnort: Durham, U.K.

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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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