ฉันใช้ cProfile เพื่อสร้างโปรไฟล์โค้ดของฉันและมันก็ใช้งานได้ดี ฉันยังใช้gprof2dot.pyเพื่อดูผลลัพธ์ (ทำให้ชัดเจนขึ้นเล็กน้อย)
อย่างไรก็ตาม cProfile (และ Python profilers อื่น ๆ ส่วนใหญ่ที่ฉันเคยเห็นจนถึงตอนนี้) ดูเหมือนจะเป็นโปรไฟล์ที่ระดับการเรียกใช้ฟังก์ชันเท่านั้น สิ่งนี้ทำให้เกิดความสับสนเมื่อมีการเรียกฟังก์ชันบางอย่างจากที่ต่างๆ - ฉันไม่รู้ว่าการโทร # 1 หรือโทร # 2 ใช้เวลาส่วนใหญ่ สิ่งนี้จะแย่ลงไปอีกเมื่อฟังก์ชั่นที่เป็นปัญหามีความลึกหกระดับซึ่งเรียกมาจากที่อื่นอีกเจ็ดแห่ง
ฉันจะสร้างโปรไฟล์ทีละบรรทัดได้อย่างไร
แทนสิ่งนี้:
function #12, total time: 2.0s
ฉันต้องการเห็นสิ่งนี้:
function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s
cProfile จะแสดงจำนวนเวลาทั้งหมดที่ "โอน" ไปยังผู้ปกครอง แต่การเชื่อมต่อนี้จะหายไปอีกครั้งเมื่อคุณมีเลเยอร์จำนวนมากและการโทรที่เชื่อมต่อกัน
ตามหลักการแล้วฉันชอบที่จะมี GUI ที่จะแยกวิเคราะห์ข้อมูลจากนั้นแสดงไฟล์ต้นฉบับของฉันพร้อมเวลาทั้งหมดที่กำหนดให้กับแต่ละบรรทัด สิ่งนี้:
main.py:
a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s
จากนั้นฉันจะสามารถคลิกที่การโทร "func (c)" ครั้งที่สองเพื่อดูว่าอะไรใช้เวลาในการโทรนั้นโดยแยกจากการโทร "func (a)"
มันสมเหตุสมผลไหม มีไลบรารีการทำโปรไฟล์ใดบ้างที่รวบรวมข้อมูลประเภทนี้ มีเครื่องมือที่ยอดเยี่ยมที่ฉันพลาดไปหรือไม่?
pstats.print_callers
ฉันเดาว่าคุณจะสนใจใน ตัวอย่างคือที่นี่