Episode ini membongkar cara Python bekerja di balik layar: CPython, bytecode, interpreter loop, dan GIL. Kalian juga mengenal implementasi alternatif seperti PyPy, Jython, IronPython, dan GraalPython, serta struktur project Python: modul, package, import system, dan sys.path.

Kebanyakan orang belajar Python tanpa pernah tahu apa yang terjadi di balik python3 main.py. Episode 2 membuka tirai itu: bagaimana interpreter CPython bekerja, apa itu bytecode, mengapa GIL begitu dibicarakan, dan bagaimana kode kalian diorganisasi menjadi modul dan package.
Pemahaman arsitektur ini bukan sekadar teori. Ia menjelaskan mengapa Python lambat dalam kasus tertentu, mengapa threading tidak selalu mempercepat, dan kapan memakai implementasi alternatif. Mari kita bedah lapisan demi lapisan.
CPython adalah implementasi referensi Python yang ditulis dalam bahasa C. Inilah interpreter yang kalian install lewat pyenv di episode 0. CPython menjadi patokan karena paling lengkap dan paling banyak dipakai di dunia.
CPython menjalankan kode dalam dua tahap: kompilasi ke bytecode, lalu eksekusi oleh interpreter loop. Alurnya sederhana:
sumber.py → bytecode → interpreter loop → hasilBytecode adalah representasi antara yang mirip kode mesin, tapi lebih tinggi level. Kalian bisa melihat bytecode dari sebuah fungsi dengan modul dis:
import dis
def tambah(a, b):
return a + b
dis.dis(tambah)Output dari dis.dis(tambah) menampilkan instruksi seperti LOAD_FAST, BINARY_OP, dan RETURN_VALUE. Ini membuktikan bahwa Python memang mengkompilasi kode sebelum mengeksekusinya, hanya saja hasilnya di-cache di memory.
Fakta kunci yang perlu kalian tahu: sejak versi 3.13, CPython mendukung free-threaded build yang menghapus GIL secara opsional. Namun pada build standar, GIL (Global Interpreter Lock) masih ada dan mengunci eksekusi bytecode hanya untuk satu thread dalam satu waktu.
import threading
def kerja():
total = 0
for _ in range(1_000_000):
total += 1
t = threading.Thread(target=kerja)
t.start()
t.join()
print("selesai")Pada build standar CPython, menjalankan kerja() di banyak thread tidak mempercepat komputasi CPU karena GIL. threading.Thread(target=kerja) membuat thread baru, tapi GIL memastikan hanya satu thread mengeksekusi bytecode pada satu waktu.
GIL membuat CPython sederhana dan aman untuk memory management, tapi membatasi paralelisme CPU. Solusi umumnya adalah multiprocessing untuk komputasi berat (episode 15) atau memakai PyPy dan free-threaded CPython. Jadi jangan heran jika Python terasa tidak secepat C untuk kalkulasi intensif.
CPython bukan satu-satunya cara menjalankan Python. Beberapa implementasi alternatif menawarkan keunggulan berbeda:
PyPy menarik untuk komputasi intensif karena JIT-nya. Jython dan IronPython jarang dipakai, tapi penting saat kalian harus berinteraksi dengan ekosistem Java atau .NET. Untuk series ini, kita tetap memakai CPython karena paling kompatibel dengan library modern.
Di Python, modul adalah file .py tunggal, sedangkan package adalah direktori berisi modul-modul dengan file __init__.py. Penanda package inilah yang membedakannya dari direktori biasa. Struktur sederhananya:
project/
main.py
utils/
__init__.py
helper.pyFile __init__.py bisa kosong atau berisi inisialisasi. Dengan struktur ini, kalian bisa mengimpor lewat from utils.helper import fungsi. Penanda __init__.py membuat direktori utils dikenali sebagai package.
Saat kalian menulis import modul, Python mencari modul di direktori yang terdaftar di sys.path. Urutan pencariannya mencakup direktori script, environment variables, dan site-packages. Kalian bisa melihat daftarnya:
import sys
for path in sys.path:
print(path)Perulangan for path in sys.path mencetak lokasi pencarian import. Jika nama file lokal bentrok dengan library, file lokal yang menang. Karena itu hindari menamai file dengan nama modul standar seperti random.py atau json.py.
Mari praktikkan konsep di atas dalam project kecil:
mkdir belajar-struktur
cd belajar-struktur
touch __init__.py main.pyPerintah mkdir belajar-struktur membuat direktori, lalu touch main.py membuat file utama. Dengan struktur ini, kalian sudah punya package kosong yang siap diisi di episode 3 dan 7.
Struktur yang rapi menentukan kemudahan pemeliharaan. Modul yang kecil dan fokus lebih mudah diuji, diimpor, dan dipakai ulang. Kebiasaan ini akan berlanjut ke episode 7 ketika kita membahas packaging dan pyproject.toml.
Inti yang harus dibawa pulang:
Di episode 3 selanjutnya kita akan membahas sintaks dan struktur program — tipe data built-in, operator, kontrol alur, fungsi, dan comprehensions, lengkap dengan best practice penamaan dan docstring. Ini saatnya kalian mulai menulis banyak kode Python!