Kodumun profilini çıkarmak için cProfile kullanıyorum ve harika çalışıyor. Sonuçları görselleştirmek için gprof2dot.py'yi de kullanıyorum (biraz daha net hale getiriyor).
Ancak, cProfile (ve şimdiye kadar gördüğüm diğer çoğu Python profil oluşturucusu) yalnızca işlev çağrısı düzeyinde profil oluşturuyor gibi görünüyor. Bu, belirli işlevler farklı yerlerden çağrıldığında kafa karışıklığına neden oluyor - çoğu zaman 1 numaralı çağrının mı yoksa 2 numaralı çağrının mı yapıldığı konusunda hiçbir fikrim yok. Söz konusu işlev, yedi farklı yerden çağrılan altı seviye derin olduğunda bu daha da kötüleşir.
Nasıl satır satır profil oluşturabilirim?
Bunun yerine:
function #12, total time: 2.0s
Bunun gibi bir şey görmek isterim:
function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s
cProfile, toplam sürenin ne kadarının ebeveyne "aktarıldığını" gösterir, ancak yine bir grup katman ve birbirine bağlı aramalarınız olduğunda bu bağlantı kesilir.
İdeal olarak, verileri ayrıştıracak bir GUI'ye sahip olmayı ve ardından bana her satıra verilen toplam süreyi içeren kaynak dosyamı göstermeyi çok isterim. Bunun gibi bir şey:
main.py:
a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s
Daha sonra, "func (a)" çağrısından ayrı olarak, bu çağrıda neyin sürdüğünü görmek için ikinci "func (c)" çağrısına tıklayabilirim.
bu mantıklı mı? Bu tür bilgileri toplayan herhangi bir profil oluşturma kitaplığı var mı? Kaçırdığım harika bir araç var mı?
pstats.print_callers
. Burada bir örnek var .