python / python/cpython

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

Offen
#128,762 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

interpreter-core type-bug
Vorherrschende Sprache
Python
Sterne
77.2k
Forks
35.9k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit dem gemeldeten Verhalten von sys.getsizeof() und reproduziere das dataclass-Node-Beispiel, während du dessen Ausgabe mit dem _PyObject_Malloc-Trace in GDB vergleichst. Untersuche, wie Inline-Werte berücksichtigt werden; abgeschlossen ist die Aufgabe, wenn die gemeldete Größe die durch das Beispiel demonstrierten Allokationen widerspiegelt, ohne bestehendes Verhalten zu regressieren.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
backend, performance
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.