2016-06-30 10 views
0
import sys 
npArrayList = 20000 * [None] 
npNdArray = np.random.normal(size = (20000, 4)) 
for i in xrange(20000): 
    npArrayList[i] = npNdArray[i, ] 
    if i == 0: 
     print 'npArrayList[i].nbytes = ' + str(npArrayList[i].nbytes) 

print 'npArrayList size = ' + str(sys.getsizeof(npArrayList)) 
print 'npNdArray.nbytes = ' + str(npNdArray.nbytes) 

Die Konsole Ergebnisse sind:Python: sys.getsizeof vaue von numpy ndarray scheint zu klein

npArrayList[i].nbytes = 32 
npArrayList size = 160064 
npNdArray.nbytes = 640000 

Der Wert von 'npArrayList Größe' scheint zu klein. 32 * 20000 = 640000, während der Wert nur 160064 ist.

Wie dies zu erklären?

+0

Die Liste enthält Zeiger. Hier sind die Zeiger auf 4-Element-Arrays, aber jedes Array teilt Daten mit dem Master-Array (eine Ansicht) – hpaulj

Antwort

2

Gemäß der documentation, sys.getsizeof macht folgendes:

Return die Größe eines Objekts in Bytes. Das Objekt kann eine beliebige Art von Objekt sein. Alle integrierten Objekte geben korrekte Ergebnisse zurück, aber dieses muss nicht für Erweiterungen von Drittanbietern gelten, da es implementierungsspezifisch ist.

Nur der Speicherverbrauch, der dem Objekt direkt zugeordnet wird, wird berücksichtigt, nicht der Speicherverbrauch der Objekte, auf die es sich bezieht.

So nur sehr primitive Typen in eingebauten Objekten werden Sie jemals wirklich genaue Ergebnisse erhalten. Selbst für integrierte Containertypen müssen Sie normalerweise eine Art rekursiver Funktion verwenden, um die "Gesamtgröße" des Containers (Liste, Wörterbuch usw.) zu ermitteln. Denken Sie jedoch daran, dass eine Python-Liste wirklich nur eine Reihe von Zeigern ist, so dass es in gewisser Weise eine genaue Zahl ist.

aber Sie suchen nach etwas wie folgt aus:

https://code.activestate.com/recipes/577504/

Auch beachten:

>>> sys.getsizeof(npArrayList[0]) 
96 
>>> 

Jedes numpy Objekt -oder jedes Objekt für die Materie- hat einen Overhead, und wenn Sie eine np.array als Listenelement zuweisen, erstellen Sie ein neues Objekt, also wirklich, das folgende dauert nur ich n, um den Speicher des Array-Inhalts und nicht den Overhead des gesamten Objekts zu berücksichtigen:

Verwandte Themen