Python Academy · leksjon

Referansetelling i CPython

Forstå hvordan CPython følger objektenes levetid med referansetellere.

Leksjon 1 av 413 trinn

Referansetelling i CPython er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva er referansetelling?

CPython holder oversikt over referansetellingen til hvert objekt. Når tellingen synker til 0, blir objektet umiddelbart deallokert. Dette er Pythons viktigste mekanisme for minnehåndtering.

import sys

x = [1, 2, 3]
print(sys.getrefcount(x))   # 2 (x + getrefcount arg)
y = x
print(sys.getrefcount(x))   # 3

sys.getrefcount()

sys.getrefcount(obj) returnerer gjeldende referansetelling. Merk: kallet legger til 1 (referansen fra funksjonsargumentet).

import sys

a = "hello"
print(sys.getrefcount(a))   # baseline (may be high for interned strings)

b = a
print(sys.getrefcount(a))   # one more
del b
print(sys.getrefcount(a))   # back to baseline

Økning og reduksjon

Hver tilordning øker tellingen, mens hver sletting eller ny tilordning reduserer den. Når tellingen når 0, kaller CPython objektets deallokeringsfunksjon.

x = []          # refcount = 1
y = x           # refcount = 2
z = [x]         # refcount = 3  (list holds a reference)
del y           # refcount = 2
z.clear()       # refcount = 1
del x           # refcount = 0 → deallocated

Objektinterning

CPython internlagrer små heltall (-5 til 256) og mange strengliteraler, slik at samme objekt brukes om igjen. is-sammenligninger avslører dette.

a = 256
b = 256
print(a is b)   # True (interned)

c = 257
d = 257
print(c is d)   # may be False (not interned)

Svake referanser

Svake referanser øker ikke referansetellingen. De er nyttige for å unngå at objekter De vil observere, men ikke eie, hindres i å bli samlet inn.

import weakref

class BigObject:
    pass

obj = BigObject()
ref = weakref.ref(obj)
print(ref())   # <BigObject instance>
del obj
print(ref())   # None (object was collected)

Referansesykluser

Hvis A refererer til B og B refererer til A, når ingen av dem 0 selv når begge er utilgjengelige. CPythons sykliske GC oppdager og samler inn disse.

a = []
b = [a]
a.append(b)   # cycle: a → b → a
del a, b
# Both are unreachable but refcount > 0
# The cyclic GC collects them

gc-modulen

gc-modulen tilbyr den sykliske søppelinnsamleren. Den kjører automatisk, men kan utløses manuelt eller deaktiveres.

import gc

gc.collect()   # force a collection cycle
print(gc.get_count())    # (gen0, gen1, gen2) allocation counts
print(gc.get_threshold())  # when each generation is collected

Minnepooler (pymalloc)

CPython allokerer små objekter (< 512 byte) fra sin egen minnepool (pymalloc), noe som er raskere enn å kalle malloc for hvert lite objekt.

# You do not call pymalloc directly — CPython uses it internally
# for all Python-level object allocations

# The pool pre-allocates large memory arenas
# and carves them into pools of fixed-size blocks

Finalisatorer med __del__

__del__ kalles når et objekts referansetelling når 0, eller senere hvis objektet inngår i en syklus. Unngå å være avhengig av det for kritisk opprydding – bruk kontekstbehandlere i stedet.

class Resource:
    def __del__(self):
        print(f"Freeing {self}")

# Better: use context manager
class SafeResource:
    def __enter__(self): return self
    def __exit__(self, *a): self.cleanup()

Kompakte objekter med __slots__

Objekter med __slots__ bruker mindre minne og færre allokeringer, noe som reduserer belastningen på GC.

import sys

class Reg:
    def __init__(self, x, y): self.x, self.y = x, y

class Slotted:
    __slots__ = ("x","y")
    def __init__(self, x, y): self.x, self.y = x, y

print(sys.getsizeof(Reg(1,2)))      # ~48 + dict overhead
print(sys.getsizeof(Slotted(1,2)))  # ~48 (no dict)

Deaktivere syklisk GC

For programmer som ikke oppretter referansesykluser, kan deaktivering av syklisk GC forbedre gjennomstrømningen.

import gc

gc.disable()   # no cyclic GC — objects are only freed by refcounting

# Use only if you KNOW no cycles are created
# (pure functional/immutable data)

gc.enable()    # re-enable

Hurtigsjekk

Når deallokerer CPython et objekt umiddelbart?

Oppsummering

CPython holder oversikt over objekter via referansetellinger. Tellingen når 0 → umiddelbar deallokering. Referansesykluser håndteres av den sykliske GC-en (gc-modulen). Unngå __del__ for kritisk opprydding; bruk kontekstbehandlere. Bruk __slots__ for å redusere minnebruken per objekt.

Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
76
Leksjoner
320

Ofte stilte spørsmål

Er leksjonen «Referansetelling i CPython» gratis?

Ja – hele teksten i «Referansetelling i CPython» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Referansetelling i CPython»?

Forstå hvordan CPython følger objektenes levetid med referansetellere. Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Python Academy?

Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Referansetelling i CPython»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?

Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Referansetelling i CPython
  2. Garbage collector og sykliske referanser
  3. Profilering med cProfile og line_profiler
  4. Minneprofilering med tracemalloc
← Tilbake til Python Academy