132 votes

Taille en mémoire de la structure en python

Quelqu'un connais une bonne carte de référence pour la taille de la mémoire de python données stucture sur 32 bits et 64 bits des plates-formes ?

Si non, ce serait bien de l'avoir sur soi. La plus exhaustive le mieux ! Donc, combien d'octets sont utilisés par ceux python structures (en fonction de la len et le type de contenu le cas échéant) ?

 - int
 - flotteur
 - référence
 - str
 - chaîne unicode
 - tuple
 - liste
 - dict
 - définir
 - tableau.tableau
 - numpy.tableau
 - deque
 - nouveau style de classes d'objet
 - vieux-classes de style de l'objet
 - ... et tout ce que je suis oublier !

(pour les conteneurs qui ne garder que des références à d'autres objets, de toute évidence, nous ne voulons pas compter la taille de l'élément en eux-mêmes, car ils peuvent être partagés)

En outre, il est un moyen d'obtenir la mémoire utilisée par l'objet au moment de l'exécution (de façon récursive ou non) ?

158voto

hughdbrown Points 15770

La recommandation d' une question antérieure sur cette a été d'utiliser le sys.getsizeof(), citant:

>>> import sys
>>> x = 2
>>> sys.getsizeof(x)
14
>>> sys.getsizeof(sys.getsizeof)
32
>>> sys.getsizeof('this')
38
>>> sys.getsizeof('this also')
48

Vous pouvez prendre cette approche:

>>> import sys
>>> import decimal
>>> 
>>> d = {
...     "int": 0,
...     "float": 0.0,
...     "dict": dict(),
...     "set": set(),
...     "tuple": tuple(),
...     "list": list(),
...     "str": "a",
...     "unicode": u"a",
...     "decimal": decimal.Decimal(0),
...     "object": object(),
... }
>>> for k, v in sorted(d.iteritems()):
...     print k, sys.getsizeof(v)
...
decimal 40
dict 140
float 16
int 12
list 36
object 8
set 116
str 25
tuple 28
unicode 28

2012-09-30

python 2.7 (linux, 32 bits):

decimal 36
dict 136
float 16
int 12
list 32
object 8
set 112
str 22
tuple 24
unicode 32

python 3.3 (linux, 32 bits)

decimal 52
dict 144
float 16
int 14
list 32
object 8
set 112
str 26
tuple 24
unicode 26

39voto

Alex Martelli Points 330805

J'ai été heureux à l'aide de pympler pour de telles tâches. Il est compatible avec de nombreuses versions de Python -- asizeof module en particulier remonte à 2.2!

Par exemple, à l'aide de hughdbrown l'exemple mais avec from pympler import asizeof au départ et à l' print asizeof.asizeof(v) à la fin, je vois (système de Python 2.5 sur MacOSX 10.5):

$ python pymp.py 
set 120
unicode 32
tuple 32
int 16
decimal 152
float 16
list 40
object 0
dict 144
str 32

Clairement il y a un certain rapprochement ici, mais je l'ai trouvé très utile pour l'analyse de l'empreinte et de réglage.

9voto

Tampa Points 4752

Essayez le profileur de mémoire. profileur de mémoire

 Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a
 

7voto

Omid Raha Points 2398

Aussi, vous pouvez utiliser le module guppy .

 >>> from guppy import hpy; hp=hpy()
>>> hp.heap()
Partition of a set of 25853 objects. Total size = 3320992 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0  11731  45   929072  28    929072  28 str
     1   5832  23   469760  14   1398832  42 tuple
     2    324   1   277728   8   1676560  50 dict (no owner)
     3     70   0   216976   7   1893536  57 dict of module
     4    199   1   210856   6   2104392  63 dict of type
     5   1627   6   208256   6   2312648  70 types.CodeType
     6   1592   6   191040   6   2503688  75 function
     7    199   1   177008   5   2680696  81 type
     8    124   0   135328   4   2816024  85 dict of class
     9   1045   4    83600   3   2899624  87 __builtin__.wrapper_descriptor
<90 more rows. Type e.g. '_.more' to view.>
 

Et:

 >>> hp.iso(1, [1], "1", (1,), {1:1}, None)
Partition of a set of 6 objects. Total size = 560 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0      1  17      280  50       280  50 dict (no owner)
     1      1  17      136  24       416  74 list
     2      1  17       64  11       480  86 tuple
     3      1  17       40   7       520  93 str
     4      1  17       24   4       544  97 int
     5      1  17       16   3       560 100 types.NoneType
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X