web-dev-qa-db-fra.com

Utilisation de la mémoire des types de base Python (particulièrement int et float)

Ceci est un exemple de l'interpréteur Python 3.8.0 (cependant, il est similaire en 3.7.5)

>>> import sys
>>> sys.getsizeof(int)
416
>>> sys.getsizeof(float)
416
>>> sys.getsizeof(list)
416
>>> sys.getsizeof(Tuple)
416
>>> sys.getsizeof(dict)
416
>>> sys.getsizeof(bool)
416

getsizeof() retourne combien d'octets Python consomme avec la surcharge du ramasse-miettes (voir ici ). Quelle est la raison pour laquelle la base python consomment la même quantité de mémoire?

Si nous regardons les instances de ces classes

>>> import sys
>>> sys.getsizeof(int())
24
>>> sys.getsizeof(float())
24

L'argument par défaut est 0 Et ces deux instances ont la même quantité de mémoire utilisée pour cet argument. Cependant, si j'essaie d'ajouter un argument

>>> sys.getsizeof(int(1))
28
>>> sys.getsizeof(float(1))
24

et c'est là que ça devient étrange. Pourquoi l'utilisation de la mémoire d'instance augmente-t-elle pour int mais pas pour le type float?

6
vezeli

En regardant la documentation , il est important de noter que:

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.

Que pouvez-vous déduire du fait que la valeur renvoyée de sys.getsizeof(int(1)) est supérieure à celle de sys.getsizeof(float(1))?

Simplement qu'il faut plus de mémoire pour représenter un int que pour représenter un float. Est-ce surprenant? Eh bien, peut-être pas, si nous pouvons nous attendre à "faire plus de choses" avec un int qu'avec un float. Nous pouvons évaluer la "quantité de fonctionnalités" au premier degré en regardant le nombre de leurs attributs:

>>> len(dir(int))
70
>>> len(dir(float))
57
1
gst