0Pricing
Python Academy · Pelajaran

Penghitungan Referensi CPython

Pahami cara CPython melacak masa hidup objek dengan penghitung referensi.

Penghitungan Referensi CPython adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.

Apa Itu Penghitungan Referensi?

CPython melacak jumlah referensi setiap objek. Saat jumlah tersebut turun menjadi 0, objek segera dibebaskan dari memori. Ini adalah mekanisme utama pengelolaan memori Python.

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) mengembalikan jumlah referensi saat ini. Catatan: pemanggilannya menambahkan 1 (referensi 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 baseline

Penambahan dan Pengurangan

Setiap penetapan menambah jumlah referensi; setiap penghapusan atau penetapan ulang menguranginya. Saat jumlahnya mencapai 0, CPython memanggil dealokator 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 → deallocated

Internasionalisasi Objek

CPython menginternalkan bilangan bulat kecil (-5 hingga 256) dan banyak literal teks dengan menggunakan kembali objek yang sama. Perbandingan is mengungkap hal ini.

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

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

Referensi Lemah

Referensi lemah tidak menambah jumlah referensi. Referensi ini berguna untuk mencegah objek yang ingin Anda amati tetapi tidak miliki agar tidak menghalangi pengumpulan sampah.

import weakref

class BigObject:
    pass

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

Siklus Referensi

Jika A merujuk ke B dan B merujuk ke A, tidak ada yang mencapai 0 meskipun keduanya tidak terjangkau. GC siklik CPython mendeteksi dan mengumpulkan objek-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 them

Modul gc

Modul gc menyediakan pengumpul sampah siklik. Modul ini berjalan secara otomatis, tetapi dapat dipicu secara manual atau dinonaktifkan.

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

Kumpulan Memori (pymalloc)

CPython mengalokasikan objek kecil (< 512 byte) dari kumpulan memorinya sendiri (pymalloc), yang lebih cepat daripada 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 blocks

Finalisasi __del__

__del__ dipanggil saat jumlah referensi objek mencapai 0 (atau lebih lambat jika objek berada dalam suatu siklus). Hindari mengandalkannya untuk pembersihan penting—gunakan pengelola konteks sebagai gantinya.

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 Ringkas dengan __slots__

Objek dengan __slots__ menggunakan lebih sedikit memori dan alokasi, sehingga mengurangi beban 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)

Menonaktifkan GC Siklik

Untuk program yang tidak membuat siklus referensi, menonaktifkan GC siklik dapat meningkatkan laju pemrosesan.

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

Pemeriksaan Singkat

Kapan CPython segera membebaskan objek dari memori?

Ringkasan

CPython melacak objek melalui jumlah referensi. Jumlah mencapai 0 → dealokasi segera. Siklus referensi ditangani oleh GC siklik (modul gc). Hindari __del__ untuk pembersihan penting; gunakan pengelola konteks. Gunakan __slots__ untuk mengurangi memori per objek.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Penghitungan Referensi CPython” gratis?

Ya — teks lengkap “Penghitungan Referensi CPython” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Penghitungan Referensi CPython”?

Pahami cara CPython melacak masa hidup objek dengan penghitung referensi. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Python Academy?

Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Penghitungan Referensi CPython” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Penghitungan Referensi CPython
  2. Pengumpul Sampah dan Referensi Siklik
  3. Pembuatan Profil dengan cProfile dan line_profiler
  4. Pembuatan Profil Memori dengan tracemalloc
← Kembali ke Python Academy