python / python/cpython

`sys.getsizeof()` does not include inline values

Ouverte
#128,762 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

interpreter-core type-bug
Langage dominant
Python
Étoiles
77.2k
Forks
35.9k
Métriques de merge des PR
Métriques de PR en attente

Description

Bug report

Bug description:

Commit tested: 5e65a1acc0b

I have a program that allocates numerous instances of this type:

@dataclass
class Node:
    cdr: Self | None

BIG_DATA = None
for i in range(50):
    BIG_DATA = Node(BIG_DATA)
    print(sys.getsizeof(BIG_DATA))

After the 28th iteration, I find that it stabilizes at printing 48. But if I run the program in GDB and trace the actual allocations, I see that it is allocating 80 bytes per iteration:

# Set a GDB-recognized breakpoint
os.kill(os.getpid(), signal.SIGTRAP)
# In GDB:
# b _PyObject_Malloc
# commands
#  silent
#  print nbytes
#  continue
# end
for i in range(50):
    BIG_DATA = Node(BIG_DATA)

I believe that the missing bytes can be accounted for in the inline values. I observe the same behavior on Python 3.13.

CPython versions tested on:

CPython main branch

Operating systems tested on:

Linux

Linked PRs
  • gh-128763

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par le comportement signalé de sys.getsizeof() et reproduisez l’exemple de dataclass Node en comparant sa sortie avec la trace de _PyObject_Malloc dans GDB. Étudiez la manière dont les valeurs inline sont prises en compte ; le travail est terminé lorsque la taille signalée reflète les allocations démontrées par l’exemple sans régression du comportement existant.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
backend, performance
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.