sys.getsizeof(), getrefcount(), intern() și alte funcții de memorie în Python

Interpretorul (sys) Python 3.0+ (getallocatedblocks: 3.4+, getunicodeinternedsize: 3.12+)

Mărimea unui obiect în memorie, numărul de referințe și internarea textelor.

Sintaxă
sys.getsizeof(obiect[, implicit])
sys.getrefcount(obiect)
sys.intern(text)
sys.getallocatedblocks()
sys.getunicodeinternedsize()

Ce face sys.getsizeof(), getrefcount(), intern() și alte funcții de memorie

getsizeof(x) returnează mărimea obiectului în octeți, fără obiectele pe care le conține: o listă de texte include doar spațiul pentru referințe, nu și textele. getrefcount(x) dă numărul de referințe către obiect (plus una temporară, pentru argument).

intern(text) păstrează o singură copie a unui text în memorie, astfel încât compararea textelor internate cu is să fie instantanee; este utilă pentru multe texte repetate (chei). getallocatedblocks() și getunicodeinternedsize() sunt pentru depanarea consumului de memorie al interpretorului. Valorile depind de versiune și platformă.

Parametri

Parametru Descriere
obiect / text Obiectul analizat.

Ce returnează

Întregi; intern: textul internat.

Exemple

Exemplul 1: Mărimi în memorie (CPython 3.14, 64 de biți)

import sys
print(sys.getsizeof(0), sys.getsizeof(2 ** 100))
print(sys.getsizeof(""), sys.getsizeof("abc"), sys.getsizeof("ăîș"))
print(sys.getsizeof([]), sys.getsizeof([1, 2, 3]), sys.getsizeof(["x" * 1000]))
print(sys.getsizeof((1, 2, 3)), sys.getsizeof({}))

Rezultat

28 40
41 44 64
56 88 64
72 64

Exemplul 2: Referințe și texte internate

import sys
date = [1, 2]
inainte = sys.getrefcount(date)
alias = date
print(sys.getrefcount(date) - inainte)
a = sys.intern("".join(["cheie_", "lunga"]))
b = sys.intern("cheie_lunga")
print(a is b, sys.getallocatedblocks() > 0, sys.getunicodeinternedsize() > 0)

Rezultat

1
True True True

Greșeli frecvente

  • Măsori memoria unei liste mari cu getsizeof și uiți elementele. Adună și mărimile elementelor, sau folosește tracemalloc.

Comenzi înrudite

  • id(): Returnează identitatea unui obiect: un număr unic cât timp obiectul există.
  • is / is not: Verifică dacă două nume arată spre exact același obiect din memorie.
  • memoryview(): Oferă acces la memoria unui obiect binar (bytes, bytearray) fără să o copieze.