Saya telah menggunakan cProfile untuk membuat profil kode saya, dan itu berfungsi dengan baik. Saya juga menggunakan gprof2dot.py untuk memvisualisasikan hasil (membuatnya sedikit lebih jelas).
Namun, cProfile (dan sebagian besar profiler Python lain yang pernah saya lihat sejauh ini) tampaknya hanya membuat profil di tingkat panggilan fungsi. Hal ini menyebabkan kebingungan ketika fungsi tertentu dipanggil dari tempat yang berbeda - Saya tidak tahu apakah panggilan # 1 atau panggilan # 2 menggunakan sebagian besar waktu. Ini menjadi lebih buruk ketika fungsi yang dimaksud adalah enam tingkat, dipanggil dari tujuh tempat lain.
Bagaimana cara mendapatkan profil baris demi baris?
Daripada ini:
function #12, total time: 2.0s
Saya ingin melihat yang seperti ini:
function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s
cProfile memang menunjukkan berapa banyak dari total waktu "transfer" ke induk, tetapi sekali lagi koneksi ini hilang ketika Anda memiliki banyak lapisan dan panggilan yang saling berhubungan.
Idealnya, saya ingin memiliki GUI yang akan mengurai data, lalu menunjukkan file sumber saya dengan total waktu yang diberikan untuk setiap baris. Sesuatu seperti ini:
main.py:
a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s
Kemudian saya akan dapat mengklik panggilan kedua "func (c)" untuk melihat apa yang menghabiskan waktu dalam panggilan itu, terpisah dari panggilan "func (a)".
Apakah itu masuk akal? Apakah ada pustaka profil yang mengumpulkan jenis informasi ini? Apakah ada alat luar biasa yang saya lewatkan?
pstats.print_callers
. Contohnya ada di sini .