Belajar Python - Performance Tuning & Profiling
Episode 16 of 23

Belajar Python - Performance Tuning & Profiling

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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.

Mengukur Waktu Eksekusi

timeit untuk Pengukuran Mikro

Sebelum profiling penuh, ukur potongan kode kecil dengan timeit:

PythonMengukur kode 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 untuk Profiling Fungsi

Profiling Seluruh Program

cProfile melacak berapa lama tiap fungsi berjalan:

PythonMembuat fungsi untuk diprofile
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:

Menjalankan cProfile
python3 -m cProfile -s cumulative perf_contoh.py

python3 -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.

Membaca Output cProfile

Output cProfile berisi kolom penting:

  • ncalls: berapa kali fungsi dipanggil.
  • tottime: waktu di fungsi itu sendiri, tanpa panggilan turunannya.
  • cumtime: waktu total termasuk fungsi yang dipanggilnya.

Fokus pada fungsi dengan tottime atau cumtime terbesar — itu kandidat optimasi utama. Jangan optimasi fungsi yang jarang dipanggil.

pyinstrument dan Sampling Profiler

Profiler yang Lebih Mudah Dibaca

pyinstrument adalah sampling profiler dengan output yang lebih ramah:

Install pyinstrument
pip install pyinstrument
Menjalankan pyinstrument
pyinstrument -r html -o profil.html perf_contoh.py

pyinstrument -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 Hot Path

Meningkatkan Algoritma

Optimasi pertama selalu di tingkat algoritma, bukan sintaks:

PythonOptimasi dengan rumus
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.

Memakai Struktur Data Tepat

Optimasi berikutnya memakai struktur data yang sesuai:

PythonSet untuk keanggotaan
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.

Ekstensi Native dengan Cython

Mempercepat dengan Cython

Cython mengompilasi kode Python dengan anotasi tipe menjadi ekstensi C:

PythonFungsi Cython
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 total

cdef 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.

Build dan Integrasi

Cython dibangun lewat setup atau pyproject:

Install Cython
pip install cython
Ekstensi di pyproject.toml
[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: Alternatif JIT

Kapan Memakai PyPy

PyPy adalah interpreter Python dengan JIT compiler yang bisa sangat cepat untuk kode CPU-bound murni:

Menjalankan dengan PyPy
pypy3 --version
pypy3 perf_contoh.py

pypy3 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.

Pertimbangan Memakai PyPy

PyPy bukan pengganti universal CPython:

  • Cocok untuk kode Python murni dengan loop intensif.
  • Kurang cocok dengan ekstensi C yang belum didukung.
  • Startup mungkin lebih lambat; long-running lebih diuntungkan.
  • Fitur Python 3.12 terbaru bisa tertinggal dari CPython.

Ukur dulu: jalankan benchmark di CPython dan PyPy, lalu bandingkan. Gunakan yang lebih cepat untuk kasus kalian.

Penutup

Inti yang harus dibawa pulang:

  • Optimasi harus berbasis pengukuran, bukan tebakan.
  • timeit mengukur potongan kode dengan presisi tinggi.
  • cProfile menemukan fungsi yang paling banyak memakan waktu.
  • pyinstrument memakai sampling dengan laporan pohon panggilan yang jelas.
  • Perbaiki algoritma dan struktur data sebelum micro-optimization.
  • Cython dan PyPy adalah langkah lanjutan untuk performa ekstrem.

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!

Belajar Python - Performance Tuning & Profiling | Belajar Python