Pengiraan Rujukan CPython
Fahami cara CPython menjejaki jangka hayat objek dengan kiraan rujukan.
Pengiraan Rujukan CPython ialah pelajaran Python Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Python Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Python Academy merangkumi sejumlah 4 pelajaran.
Apakah Pengiraan Rujukan?
CPython menjejaki kiraan rujukan setiap objek. Apabila kiraan turun kepada 0, objek dinyahperuntukkan serta-merta. Ini ialah mekanisme utama pengurusan memori Python.
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) mengembalikan kiraan rujukan semasa. Nota: memanggilnya menambah 1 (rujukan argumen fungsi).
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 baselinePenambahan dan Pengurangan
Setiap penetapan menambah kiraan; setiap pemadaman atau penetapan semula mengurangkannya. Apabila kiraan mencapai 0, CPython memanggil penyahperuntuk objek tersebut.
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 → deallocatedPenginternan Objek
CPython menginternkan integer kecil (-5 hingga 256) dan banyak literal rentetan, lalu menggunakan semula objek yang sama. Perbandingan is mendedahkan perkara ini.
a = 256
b = 256
print(a is b) # True (interned)
c = 257
d = 257
print(c is d) # may be False (not interned)Rujukan Lemah
Rujukan lemah tidak menambah kiraan rujukan. Rujukan ini berguna untuk mengelakkan pengumpulan sampah daripada menghalang objek yang ingin anda perhatikan tetapi tidak miliki.
import weakref
class BigObject:
pass
obj = BigObject()
ref = weakref.ref(obj)
print(ref()) # <BigObject instance>
del obj
print(ref()) # None (object was collected)Kitaran Rujukan
Jika A merujuk B dan B merujuk A, kedua-duanya tidak mencapai 0 walaupun kedua-duanya tidak lagi boleh dicapai. GC kitaran CPython mengesan dan mengumpulkan objek ini.
a = []
b = [a]
a.append(b) # cycle: a → b → a
del a, b
# Both are unreachable but refcount > 0
# The cyclic GC collects themModul gc
Modul gc menyediakan pengumpul sampah kitaran. Modul ini berjalan secara automatik tetapi boleh dicetuskan secara manual atau dilumpuhkan.
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 collectedKumpulan Memori (pymalloc)
CPython memperuntukkan objek kecil (< 512 bait) daripada kumpulan memorinya sendiri (pymalloc), yang lebih pantas berbanding memanggil malloc untuk setiap objek kecil.
# 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 blocksPemuktamad __del__
__del__ dipanggil apabila kiraan rujukan objek mencapai 0 (atau kemudian jika objek itu berada dalam kitaran). Elakkan bergantung padanya untuk pembersihan penting — gunakan pengurus konteks.
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()Objek Padat dengan __slots__
Objek dengan __slots__ menggunakan kurang memori dan lebih sedikit peruntukan, lalu mengurangkan tekanan 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)Melumpuhkan GC Kitaran
Bagi program yang tidak mencipta kitaran rujukan, melumpuhkan GC kitaran boleh meningkatkan kadar pemprosesan.
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-enableSemakan Ringkas
Bilakah CPython menyahperuntukkan objek dengan serta-merta?
Ringkasan
CPython menjejaki objek melalui kiraan rujukan. Kiraan mencapai 0 → penyahperuntukan serta-merta. Kitaran rujukan dikendalikan oleh GC kitaran (modul gc). Elakkan __del__ untuk pembersihan penting; gunakan pengurus konteks. Gunakan __slots__ untuk mengurangkan memori bagi setiap objek.
Pelajari Python dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 76
- Pelajaran
- 320
Soalan Lazim
Adakah pelajaran “Pengiraan Rujukan CPython” percuma?
Ya — teks penuh “Pengiraan Rujukan CPython” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Python Academy, tingkat taraf kepada CoddyKit PRO. Kursus Python Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Pengiraan Rujukan CPython”?
Fahami cara CPython menjejaki jangka hayat objek dengan kiraan rujukan. Anda berlatih Python Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Python Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Python Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Pengiraan Rujukan CPython” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Python Academy ini?
Ya. Setiap pelajaran Python Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pengiraan Rujukan CPython
- Pengutip Sampah dan Rujukan Bersiklus
- Pemprofilan dengan cProfile dan line_profiler
- Pemprofilan Memori dengan tracemalloc