Ringkasan eksekutif

Saya baca tulisan Rodrigo Girão Serrão yang mengulas modul baru profiling di Python 3.15, yang merapikan dua profiler bawaan — sampling profiler bernama Tachyon dan tracing profiler yang dulu kita kenal sebagai cProfile — ke satu namespace. Tulisannya menjelaskan kapan masing-masing cocok dipakai, karena keduanya punya trade-off yang cukup berbeda soal akurasi dan overhead.

Masalah yang diselesaikan

Sebelum Python 3.15, tooling profiling di stdlib agak berantakan: ada modul profile lama yang pure-Python dan menurut artikel ini "of little practical use", lalu ada cProfile yang terpisah sebagai modul sendiri. Lewat PEP 799, Python 3.15 menyatukan semuanya di bawah modul profiling, dengan dua submodule: profiling.sampling (Tachyon) dan profiling.tracing (penerus cProfile). Modul profile yang lama resmi deprecated di 3.15 dan dijadwalkan dihapus di Python 3.17, jadi kalau masih ada kode yang mengimpornya, itu sudah mulai jadi technical debt.

Fitur utama dan contoh kode

Yang menarik buat saya adalah artikel ini menegaskan bahwa kedua profiler itu bukan pengganti satu sama lain, tapi alat dengan tujuan berbeda:

  • profiling.sampling (Tachyon): statistical profiler yang mengambil snapshot call stack dengan frekuensi tinggi, overhead-nya hampir nol, dan punya kemampuan lanjutan (attach ke proses yang sedang jalan, profiling program concurrent/async, GIL mode).
  • profiling.tracing (bekas cProfile): deterministic profiler yang menginstrumentasi kode sehingga hasilnya exact (jumlah call pasti benar), tapi overhead-nya moderate dan cuma bisa dipakai lewat CLI atau programmatic, tidak bisa attach ke proses yang sudah berjalan.

Cara pakainya dari command line juga sedikit berbeda. Tracing profiler menerima nama script langsung sebagai argumen:

python -m profiling.tracing myscript.py

Sementara Tachyon punya CLI yang lebih lengkap, jadi perlu subcommand run:

python -m profiling.sampling run myscript.py

Untuk menyimpan hasilnya ke file alih-alih print ke layar, tinggal tambahkan flag -o sebelum nama script:

# Tracing profiler
python -m profiling.tracing -o stats.prof myscript.py

# Sampling profiler (Tachyon)
python -m profiling.sampling -o stats.prof myscript.py

File hasilnya bisa dibaca lagi lewat modul pstats — ini contoh ilustrasi dari artikel untuk baca statistik tersebut:

import pstats

statistics = pstats.Stats("stats.prof")
statistics.print_stats()

Catatan penting: tracing profiler hanya menghasilkan format yang kompatibel dengan pstats, sedangkan Tachyon mendukung format output lain seperti flamegraph dan heatmap.

Dampak dan catatan upgrade

Rekomendasi default dari artikel ini cukup jelas: pakai Tachyon (profiling.sampling) sebagai pilihan pertama karena overhead-nya minim dan kemampuannya lebih modern, lalu baru pindah ke tracing profiler (profiling.tracing) kalau butuh (1) jumlah call yang exact, (2) pemakaian programmatic — karena Tachyon cuma punya CLI, tidak bisa dipanggil programmatically — atau (3) mengukur perbedaan performa yang kecil (1–2%), yang mungkin tidak tertangkap oleh sifat statistik Tachyon. Untuk micro-benchmark level ekspresi kecil, artikel ini mengingatkan supaya tetap pakai timeit, bukan profiler mana pun.

Buat yang masih mengandalkan import profile atau import cProfile langsung, ini saatnya mulai migrasi ke profiling.tracing sebelum modul profile benar-benar dihapus di Python 3.17. Artikel ini juga menyebut fitur lanjutan yang tidak dibahas detail — profiling programmatic dengan tracing profiler, manipulasi statistik lewat pstats, serta fitur Tachyon untuk attach ke proses yang sedang berjalan dan profiling program concurrent/async — jadi kalau butuh itu, dokumentasi resminya (docs.python.org/3/library/profiling.html) jadi rujukan lanjutan.

---

Pertama diumumkan di Planet Python. Baca sumber aslinya untuk detail lengkap.