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
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
@BrenBarn En fait, je n'avais pas et il répond à ma question. Je vous remercie! –
http://stackoverflow.com/a/30316760/533399 – DhruvPathak