Referenzzählung in CPython
Verstehen Sie, wie CPython mit Referenzzählern die Lebensdauer von Objekten verfolgt.
Referenzzählung in CPython ist eine kostenlose Python Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Python Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.
Was ist Referenzzählung?
CPython verfolgt den Referenzzähler jedes Objekts. Wenn der Zähler auf 0 sinkt, wird das Objekt sofort freigegeben. Dies ist Pythons wichtigster Mechanismus zur Speicherverwaltung.
import sys
x = [1, 2, 3]
print(sys.getrefcount(x)) # 2 (x + getrefcount arg)
y = x
print(sys.getrefcount(x)) # 3sys.getrefcount()
sys.getrefcount(obj) gibt den aktuellen Referenzzähler zurück. Hinweis: Der Aufruf erhöht ihn um 1 (durch die Referenz auf das Funktionsargument).
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 baselineErhöhen und verringern
Jede Zuweisung erhöht den Zähler; jede Löschung oder Neuzuweisung verringert ihn. Wenn der Zähler 0 erreicht, ruft CPython den Deallokator des Objekts auf.
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 → deallocatedObjekt-Interning
CPython verwendet kleine Ganzzahlen (-5 bis 256) und viele String-Literale wieder, indem es dasselbe Objekt mehrfach nutzt. Vergleiche mit is machen dies sichtbar.
a = 256
b = 256
print(a is b) # True (interned)
c = 257
d = 257
print(c is d) # may be False (not interned)Schwache Referenzen
Schwache Referenzen erhöhen den Referenzzähler nicht. Sie sind nützlich, um zu verhindern, dass die Garbage Collection Objekte zurückhält, die Sie beobachten, aber nicht besitzen möchten.
import weakref
class BigObject:
pass
obj = BigObject()
ref = weakref.ref(obj)
print(ref()) # <BigObject instance>
del obj
print(ref()) # None (object was collected)Referenzzyklen
Wenn A auf B und B auf A verweist, erreicht keines der beiden Objekte 0, selbst wenn beide nicht erreichbar sind. Der zyklische GC von CPython erkennt und sammelt solche Zyklen.
a = []
b = [a]
a.append(b) # cycle: a → b → a
del a, b
# Both are unreachable but refcount > 0
# The cyclic GC collects themDas gc-Modul
Das Modul gc stellt den zyklischen Garbage Collector bereit. Er läuft automatisch, kann aber auch manuell ausgelöst oder deaktiviert werden.
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 collectedSpeicherpools (pymalloc)
CPython reserviert kleine Objekte (< 512 Bytes) aus einem eigenen Speicherpool (pymalloc), der schneller ist, als für jedes kleine Objekt malloc aufzurufen.
# 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__del__-Finalizer
__del__ wird aufgerufen, wenn der Referenzzähler eines Objekts 0 erreicht (oder später, wenn es sich in einem Zyklus befindet). Verlassen Sie sich bei kritischer Bereinigung nicht darauf – verwenden Sie stattdessen Context Manager.
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 Objekte mit __slots__
Objekte mit __slots__ benötigen weniger Speicher und weniger Reservierungen, wodurch die Belastung des GC sinkt.
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)Zyklischen GC deaktivieren
Bei Programmen, die keine Referenzzyklen erzeugen, kann das Deaktivieren des zyklischen GC den Durchsatz verbessern.
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-enableSchnelltest
Wann gibt CPython ein Objekt sofort frei?
Zusammenfassung
CPython verfolgt Objekte über Referenzzähler. Der Zähler erreicht 0 → sofortige Freigabe. Referenzzyklen werden vom zyklischen GC (Modul gc) verarbeitet. Vermeiden Sie __del__ für kritische Bereinigungen und verwenden Sie Context Manager. Verwenden Sie __slots__, um den Speicherbedarf pro Objekt zu reduzieren.
Häufig gestellte Fragen
Ist die Lektion „Referenzzählung in CPython“ kostenlos?
Ja — der vollständige Text von „Referenzzählung in CPython“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Python Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Python Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Referenzzählung in CPython“?
Verstehen Sie, wie CPython mit Referenzzählern die Lebensdauer von Objekten verfolgt. Du übst Python Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Python Academy zu starten?
Keine Vorkenntnisse erforderlich. Python Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Referenzzählung in CPython“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Python Academy-Lektion Code schreiben und ausführen?
Ja. Jede Python Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Referenzzählung in CPython
- Der Garbage Collector und zyklische Referenzen
- Profiling mit cProfile und line_profiler
- Speicherprofiling mit tracemalloc