2016-07-10 2 views
2

eine Funktion verwenden erstelle ich eine Liste von Millionen Sendungen innerhalb und prüfen SpeicherverbrauchPython Erinnerung an die Liste in „für“ Schleife

print ('Memory at start: {0} Mb'.format(memory_usage_psutil())) 
my_list = people_list(1000000) 
print ('Memory at end: {0} Mb'.format(memory_usage_psutil())) 

Was ich erhalte, ist:

Memory at start: 100.90625 Mb 
Memory at end: 403.8125 Mb 

So Erstellen einer Liste und es im Speicher zu halten dauert ~ 300 MB.

Zum Beispiel möchte ich Menge Artikel von my_listOHNE in TEIL zählen len() mit

count = 0 
additional_list = my_list[0:500000] 
for item in additional_list: 
    count += 1 
    if count == 499999: 
     print ('Memory in loop: {0} Mb'.format(memory_usage_psutil())) 

und Ergebnisse verwirrt mich.

Ich erwartete, dass das Erstellen zusätzlicher Liste wird Speicherverbrauch um 150 MB erhöhen, aber es ist nicht geschehen. Kannst du erklären warum? Ich meine ids sind verschiedene

In [30]: id(my_list) 
Out[30]: 2672641621704 

In [31]: id(additional_list) 
Out[31]: 2672642905864 

und gleiche Ergebnisse stammen aus:

for item in my_list[0:500000]: 
    count += 1 
    if count == 499999: 
     print ('Memory in loop: {0} Mb'.format(memory_usage_psutil())) 

Antwort

2

Es ist wahr, dass Ihre zwei Listen verschiedene Objekte sind und unterschiedliche Adressen im Speicher. Die einzelnen Objekte in der Liste sind jedoch identisch. Die Verwendung eines Slices ermöglichte es Ihnen, einige Elemente in Ihrer Liste zu sehen.

Sie können bestätigen, dass mit ::

>>> map(id, my_list)[0:500000] == map(id, additional_list) 
+0

Die Liste noch 500000 Adressen auf diese Objekte enthält, die mindestens ein paar MB kosten sollte. –

+0

Ihr letztes Beispiel scheitert für mich. Tatsächlich ist map (id, some_list) == map (id, some_list) '* immer *' False ', da Sie zwei verschiedene 'map' Objekte erstellen. – Bakuriu

+0

@Bakuriu 'map' gibt Ihnen kein' map object', es ist eine Python 'liste' von' long', die der '==' Operator nach Inhalt vergleicht. Sie könnten "map" von etwas anderem in Ihrer Shell überschattet haben? – Meitham