मैं अपने कोड को प्रोफाइल करने के लिए cProfile का उपयोग कर रहा हूं, और यह बहुत अच्छा काम कर रहा है। मैं परिणामों की कल्पना करने के लिए gprof2dot.py का उपयोग करता हूं (इसे थोड़ा स्पष्ट करता है)।
हालाँकि, cProfile (और सबसे अधिक पायथन प्रोफाइलर्स जो मैंने अब तक देखे हैं) फ़ंक्शन-कॉल स्तर पर केवल प्रोफ़ाइल के लिए प्रतीत होते हैं। यह भ्रम का कारण बनता है जब कुछ कार्यों को अलग-अलग स्थानों से बुलाया जाता है - मुझे नहीं पता कि क्या # 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
तब मैं दूसरी "फंक (c)" कॉल पर क्लिक करने में सक्षम होऊंगा यह देखने के लिए कि कॉल में क्या समय लग रहा है, "func (a)" कॉल से अलग।
क्या इसका कोई मतलब है? क्या कोई प्रोफाइलिंग लाइब्रेरी है जो इस प्रकार की जानकारी एकत्र करती है? क्या कोई भयानक उपकरण है जो मैंने याद किया है?
pstats.print_callers
। एक उदाहरण यहाँ है ।