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?
sumber
pstats.print_callers
. Contohnya ada di sini .Jawaban:
Saya percaya itulah yang dimaksudkan untuk line_profiler Robert Kern . Dari tautan:
Semoga membantu!
sumber
import line_profiler;
lalu ?Anda juga bisa menggunakan pprofile ( pypi ). Jika Anda ingin membuat profil seluruh eksekusi, itu tidak memerlukan modifikasi kode sumber. Anda juga dapat membuat profil subset dari program yang lebih besar dengan dua cara:
beralih profil saat mencapai titik tertentu dalam kode, seperti:
toggle profiling asynchronous from call stack (memerlukan cara untuk memicu kode ini dalam aplikasi yang dipertimbangkan, misalnya penangan sinyal atau thread pekerja yang tersedia) dengan menggunakan profil statistik:
Format keluaran anotasi kode sangat mirip dengan profiler baris:
Perhatikan bahwa karena pprofile tidak bergantung pada modifikasi kode, pprofile dapat membuat profil pernyataan modul tingkat atas, memungkinkan untuk membuat profil waktu startup program (berapa lama waktu yang diperlukan untuk mengimpor modul, menginisialisasi global, ...).
Itu dapat menghasilkan keluaran berformat cachegrind, sehingga Anda dapat menggunakan kcachegrind untuk menelusuri hasil yang besar dengan mudah.
Pengungkapan: Saya penulis profil.
sumber
Anda dapat mengambil bantuan paket line_profiler untuk ini
1. Instal paketnya terlebih dahulu:
2. Gunakan perintah ajaib untuk memuat paket ke lingkungan python / notebook Anda
3. Jika Anda ingin membuat profil kode untuk suatu fungsi,
lakukan hal berikut:
Anda akan mendapatkan hasil format yang bagus dengan semua detail jika Anda mengikuti langkah-langkah ini :)
sumber
Hanya untuk meningkatkan jawaban @Joe Kington yang disebutkan di atas .
Untuk Python 3.x , gunakan line_profiler :
Instalasi:
Pemakaian:
Misalkan Anda memiliki program
main.py
dan di dalamnya, fungsifun_a()
danfun_b()
Anda ingin membuat profil sehubungan dengan waktu; Anda perlu menggunakan dekorator@profile
sebelum definisi fungsi. Misalnya,Program dapat diprofilkan dengan menjalankan perintah shell:
Argumen dapat diambil menggunakan
$ kernprof -h
Hasilnya akan dicetak di konsol sebagai:
EDIT: Hasil dari profiler dapat diurai menggunakan paket TAMPPA . Dengan menggunakannya, kita bisa mendapatkan plot baris demi baris yang diinginkan sebagai
sumber
PyVmMonitor memiliki tampilan langsung yang dapat membantu Anda di sana (Anda dapat terhubung ke program yang sedang berjalan dan mendapatkan statistik darinya).
Lihat: http://www.pyvmmonitor.com/
sumber