Episode ini mengajarkan optimasi berbasis data: profiler seperti cProfile dan pyinstrument, sampling profiler dan flame graph, optimasi hot path, ekstensi native dengan Cython, serta kapan memakai PyPy untuk aplikasi yang butuh kecepatan tinggi.

Aplikasi lambat biasanya karena beberapa baris kode, bukan seluruh program. Episode 16 mengajarkan cara menemukan baris itu dengan data: profiling. Kalian akan belajar memakai cProfile, pyinstrument, dan flame graph untuk menemukan hot path.
Kita juga membahas strategi optimasi — dari perbaikan algoritma hingga ekstensi native Cython — dan kapan PyPy menjadi pilihan tepat. Prinsip utamanya satu: optimasi harus berbasis pengukuran, bukan tebakan.
Sebelum profiling penuh, ukur potongan kode kecil dengan timeit:
import timeit
kode = "total = sum(range(1000))"
waktu = timeit.timeit(kode, number=10_000)
print(f"waktu per eksekusi: {waktu / 10_000:.6f} detik")timeit.timeit(kode, number=10_000) menjalankan kode ribuan kali dan mengukur total waktunya. timeit mematikan garbage collector dan memakai clock yang presisi, sehingga hasilnya konsisten. Ini alat pertama untuk membandingkan dua implementasi.
cProfile melacak berapa lama tiap fungsi berjalan:
def total_genap(n):
return sum(i for i in range(n) if i % 2 == 0)
def jalankan():
return total_genap(1_000_000)
if __name__ == "__main__":
jalankan()sum(i for i in range(n) if i % 2 == 0) menghitung total bilangan genap. Simpan file ini sebagai perf_contoh.py, lalu jalankan profiler:
python3 -m cProfile -s cumulative perf_contoh.pypython3 -m cProfile -s cumulative perf_contoh.py menjalankan skrip dengan profiler dan mengurutkan hasil berdasarkan waktu kumulatif. Output menampilkan tabel fungsi dengan kolom ncalls, tottime, dan cumtime — inilah data untuk menemukan hot path.
Output cProfile berisi kolom penting:
Fokus pada fungsi dengan tottime atau cumtime terbesar — itu kandidat optimasi utama. Jangan optimasi fungsi yang jarang dipanggil.
pyinstrument adalah sampling profiler dengan output yang lebih ramah:
pip install pyinstrumentpyinstrument -r html -o profil.html perf_contoh.pypyinstrument -r html -o profil.html perf_contoh.py menghasilkan laporan HTML. Berbeda dari cProfile yang menganalisis setiap panggilan, pyinstrument melakukan sampling — mencatat stack trace secara periodik. Outputnya berupa pohon panggilan yang mudah dibaca.
Optimasi pertama selalu di tingkat algoritma, bukan sintaks:
def total_genap_cepat(n):
k = (n - 1) // 2
return k * (k + 1)
print(total_genap_cepat(10))k * (k + 1) menghitung jumlah bilangan genap dengan rumus matematika O(1), menggantikan loop O(n). Ini contoh perbaikan kompleksitas — jauh lebih berdampak daripada micro-optimization. Selalu cari pendekatan algoritmik yang lebih baik dulu.
Optimasi berikutnya memakai struktur data yang sesuai:
target = {i for i in range(100_000)}
print(99_999 in target)Set comprehension {i for i in range(100_000)} membangun himpunan untuk pencarian O(1). Mengganti list dengan set atau dict untuk lookup adalah optimasi praktis yang langsung terasa pada data besar.
Cython mengompilasi kode Python dengan anotasi tipe menjadi ekstensi C:
def total_genap_cy(int n):
cdef long total = 0
cdef int i
for i in range(n):
if i % 2 == 0:
total += i
return totalcdef long total = 0 mendeklarasikan variabel bertipe C yang dioptimasi. Cython menghilangkan overhead interpreter di hot loop. Untuk kode numerik intensif, percepatannya bisa puluhan kali lipat.
Cython dibangun lewat setup atau pyproject:
pip install cython[tool.cythonize]
target_dir = "build"pip install cython menginstall compiler. Cython berguna saat profiling menunjukkan hot path yang murni numerik. Untuk sebagian besar aplikasi, perbaikan algoritma dan struktur data sudah cukup — Cython adalah langkah lanjutan.
PyPy adalah interpreter Python dengan JIT compiler yang bisa sangat cepat untuk kode CPU-bound murni:
pypy3 --version
pypy3 perf_contoh.pypypy3 perf_contoh.py menjalankan skrip di interpreter PyPy. JIT mengkompilasi loop yang sering dieksekusi menjadi kode mesin, menghasilkan percepatan dramatis untuk komputasi berulang. Tanpa mengubah kode sama sekali, kalian bisa mendapat kecepatan lebih.
PyPy bukan pengganti universal CPython:
Ukur dulu: jalankan benchmark di CPython dan PyPy, lalu bandingkan. Gunakan yang lebih cepat untuk kasus kalian.
Inti yang harus dibawa pulang:
Di episode 17 selanjutnya kita akan membahas type checking dan contracting — static typing dengan typing seperti Annotated, TypedDict, Protocol, dan ParamSpec, serta mypy dan pyright. Manfaat untuk maintenance, refactoring, dan codebase besar akan kita bedah. Kode kalian akan lebih aman dan terdokumentasi!