2016-12-25 2 views
3

La taille en mémoire d'un objet peut être obtenue avec sys.getsizeof. Comme on pouvait s'y attendre, la taille de [] est inférieure à la taille de [[]]. Sur ma machine, je reçois les tailles suivantes:Python - Taille en mémoire des listes vides imbriquées

>>> sys.getsizeof([]) 
36 
>>> sys.getsizeof([[]]) 
40 

Maintenant, quel que soit le nombre de listes vides emboîtés j'ai, je reçois toujours la même taille:

>>> sys.getsizeof([[[]]]) 
40 
>>> sys.getsizeof([[[[]]]]) 
40 

Quelle est la raison pour laquelle la taille des listes vides imbriquées semble avoir une limite supérieure?

+7

Avez-vous lu [la documentation] (https://docs.python.org/3/library/sys.html#sys.getsizeof), en particulier la partie qui dit "Seule la consommation de mémoire directement attribuée à l'objet est prise en compte, pas la consommation de mémoire des objets auxquels il se réfère". – BrenBarn

+0

@BrenBarn En fait, je n'avais pas et il répond à ma question. Je vous remercie! –

+0

http://stackoverflow.com/a/30316760/533399 – DhruvPathak

Répondre

3

lecture the documentation aurait m'a appris que lorsque vous appelez getsizeof,

Seule la consommation de mémoire directement attribué à l'objet est explique, non pas la consommation de mémoire des objets, il se réfère.

Depuis [] est un récipient, sa taille, selon getsizeof, est sa propre taille, plus la taille des références qu'il contient, mais pas les dimensions des objets visés.

Par conséquent, si [] a une taille de 36, et une référence a une taille de 4, la taille de [[]] est 36+4, par conséquent 40.

Maintenant, [[[]]] est rien de plus que [x]x est une référence à [[]]. Par conséquent, la taille de [[[]]] est la taille de [] plus la taille d'une référence, donc 40 ainsi.

4

La taille se réfère simplement à l'objet le plus extérieur et non à ceux imbriqués. Du point de vue de getsizeof la taille de l'objet est juste la taille de l'objet plus la taille des pointeurs contenus dans l'objet pas les objets pointés vers. Vous pouvez le voir parmi les options suivantes:

>>> import sys 
>>> sys.getsizeof([]) 
64 
>>> sys.getsizeof([[]]) 
72 
>>> sys.getsizeof([[[]]]) 
72 
>>> sys.getsizeof([[],[]]) 
80 
>>> sys.getsizeof([[[]],[[]]]) 
80 

Si vous voulez obtenir l'empreinte totale de la mémoire, vous aurez soit besoin de trouver récursive les tailles pour l'objet ou utiliser un autre profilage de la mémoire.

Aussi, si vous écrivez vos propres objets et que vous voulez getsizeof pour revenir correctement la taille que vous pouvez implémenter votre propre méthode __sizeof__. Par exemple:

import sys 
class mylist: 
    def __init__(self, iterable): 
     self.data = list(iterable) 

    def __sizeof__(self): 
     return object.__sizeof__(self) + \ 
      sum(sys.getsizeof(v) for v in self.__dict__.values()) + \ 
      sum(sys.getsizeof(item) for item in self.data) 

original_data = [[1,2,3], [1,2,3]] 
print(sys.getsizeof(original_data)) 
foo = mylist(original_data) 
print(sys.getsizeof(foo)) 

Résultats:

~/code_snippets$ python3 sizeof_list.py 
80 
336