Allocation mémoire listes python
Allocation mémoire listes python
Bonjour,
Alors voilà, mettons que j'ai un ensemble de 50 objets de type grosmachin, et que je les range dans une liste L python (et pas un array numpy) de longueur 1000, c'est à dire dans laquelle 50 cases contiennent des objets de type grosmachin et 950 contiennent le nombre 0.
Le truc c'est que la taille en mémoire d'un gros machin est très importante.
Ma question porte sur la taille mémoire de la liste ainsi créée :
Est ce que taille(L) = 50*taille(grosmachin) + 950*taille(0) ou alors taille(L) = 1000*taille(grosmachin)?
Autre question : qu'est-ce qui prend le plus de place en mémoire : un objet de type None, un booléen, ou l'entier 0 ?
Alors voilà, mettons que j'ai un ensemble de 50 objets de type grosmachin, et que je les range dans une liste L python (et pas un array numpy) de longueur 1000, c'est à dire dans laquelle 50 cases contiennent des objets de type grosmachin et 950 contiennent le nombre 0.
Le truc c'est que la taille en mémoire d'un gros machin est très importante.
Ma question porte sur la taille mémoire de la liste ainsi créée :
Est ce que taille(L) = 50*taille(grosmachin) + 950*taille(0) ou alors taille(L) = 1000*taille(grosmachin)?
Autre question : qu'est-ce qui prend le plus de place en mémoire : un objet de type None, un booléen, ou l'entier 0 ?
2014 - 2015 : MPSI2
2015 - 2016 : MP*
X 2016
2015 - 2016 : MP*
X 2016
Re: Allocation mémoire listes python
Je te laisse tester avec la commande :
Code : Tout sélectionner
liste.__sizeof__()
J'enseigne la vie en PCSI/MPSI.
Re: Allocation mémoire listes python
Et bien merci beaucoup, la réponse est donc :tinkymento a écrit :Je te laisse tester avec la commande :
Code : Tout sélectionner
liste.__sizeof__()
None < True < 0
et :
taille(L) = 1000*taille(grosmachin)
2014 - 2015 : MPSI2
2015 - 2016 : MP*
X 2016
2015 - 2016 : MP*
X 2016
Re: Allocation mémoire listes python
Bonjour,
Il vaut mieux utiliser sys.getsizeof qui prend également en compte les coûts additionnels dus au ramasse-miette (ça ne change rien ici).
Chez moi (avec Python 3.5.1)
mais
Rigolo non ?
On peut regarder comment ça se passe en mémoire :
Par contre ce que vous dites sur les listes me surprend. À ma connaissance les listes stockent plutôt des pointeurs vers les objets, et je m'attendrais à ce qu'une liste d'une taille donnée ait toujours à peu près la même taille en mémoire (pas exactement à cause du redimensionnement dynamique). Et c'est bien ce que je trouve en faisant diverses expérimentations par exemple:
Comment avez-vous trouvé :
Il vaut mieux utiliser sys.getsizeof qui prend également en compte les coûts additionnels dus au ramasse-miette (ça ne change rien ici).
Chez moi (avec Python 3.5.1)
Code : Tout sélectionner
sys.getsizeof(None) == 16
sys.getsizeof(True) == sys.getsizeof(1) == 28
mais
Code : Tout sélectionner
sys.getsizeof(False) == 24
On peut regarder comment ça se passe en mémoire :
Code : Tout sélectionner
In [1]: import sys, ctypes
In [2]: bytearray((ctypes.c_ubyte * sys.getsizeof(False)).from_address(id(False)))
Out[2]: bytearray(b'\xda\x04\x00\x00\x00\x00\x00\x00`\xe7\xe0\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
In [3]: bytearray((ctypes.c_ubyte * sys.getsizeof(True)).from_address(id(True)))
Out[3]: bytearray(b'\x96\x05\x00\x00\x00\x00\x00\x00`\xe7\xe0\x01\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00')
Code : Tout sélectionner
In [1]: import sys
In [2]: sys.getsizeof(0)
Out[2]: 24
In [3]: sys.getsizeof(set(range(100)))
Out[3]: 8416
In [4]: sys.getsizeof([0 for _ in range(1000)])
Out[4]: 9024
In [5]: sys.getsizeof([set(range(100)) for _ in range(1000)])
Out[5]: 9024
Code : Tout sélectionner
taille(L) = 1000*taille(grosmachin)
$ $P = N\!P^* ?$ $
Re: Allocation mémoire listes python
C'est juste pour pinaillerCendreWapiti a écrit :un objet de type None
None n'est pas un type, c'est un objet de type NoneType
$ $P = N\!P^* ?$ $
Re: Allocation mémoire listes python
une liste en python c'est un array et non pas une liste chainée.
https://wiki.python.org/moin/TimeComplexity
donc les overheads en mémoire sont presque nuls.
Au fait, "gros" c'est quoi pour toi?
https://wiki.python.org/moin/TimeComplexity
donc les overheads en mémoire sont presque nuls.
Etrange question. Python n'est pas un langage bas niveau donc ce genre de question...un objet de type None, un booléen, ou l'entier 0 ?
Au fait, "gros" c'est quoi pour toi?
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.
Re: Allocation mémoire listes python
C'est une erreur de ma part, si j'avais conduit une vraie expérience, j'aurais conclu que la taille de la liste en mémoire ne dépendait pas de ce qu'il y avait dedans, mais uniquement de sa longueur (enfin je crois )np* a écrit :
Comment avez-vous trouvé :
Code : Tout sélectionner
taille(L) = 1000*taille(grosmachin)
Quand je dis "grosmachin", je parle d'un objet qui a plus de 50 attributs et une dizaine de méthodesfakbill a écrit : Au fait, "gros" c'est quoi pour toi?
2014 - 2015 : MPSI2
2015 - 2016 : MP*
X 2016
2015 - 2016 : MP*
X 2016