2009-09-30 15 views
5

पर अधिकतर समय बिताता है, मैं सीपीरोफाइल, pstats और Gprof2dot का उपयोग कर रहा हूं ताकि एक लंबी पायथन स्क्रिप्ट को प्रोफाइल किया जा सके।सीप्रोफाइल और पायथन: विशिष्ट लाइन नंबर ढूँढना जो कोड

परिणाम मुझे बताते हैं कि सबसे अधिक समय मैंने परिभाषित वस्तु में एक विधि को कॉल करने में बिताया है। हालांकि, मुझे वास्तव में क्या पसंद आएगा यह जानना है कि उस कार्य के भीतर वास्तव में कौन सी रेखा संख्या समय खा रही है।

कोई विचार यह अतिरिक्त जानकारी कैसे प्राप्त करें?

उत्तर

1

समय की राशि मान लीजिए की जा रही "को खा" (वैसे, मैं अजगर 2.6 का उपयोग कर रहा OSX हिम तेंदुआ पर कि अगर मदद करता है ... द्वारा) कुछ नंबर, 40% की तरह है। फिर यदि आप प्रोग्राम को बाधित करते हैं या इसे यादृच्छिक समय पर रोकते हैं, तो संभावना 40% है कि आप इसे देखेंगे, ठीक कॉल कॉल पर उजागर। यह 10 बार करें, और 4 नमूने पर, +/-, आप इसे देखेंगे।

This tells why it works.This is an example.

2

cProfile एक समारोह के भीतर लाइन नंबर ट्रैक नहीं करता है; यह केवल उस पंक्ति संख्या को ट्रैक करता है जहां फ़ंक्शन परिभाषित किया गया था।

cProfileprofile (जो शुद्ध पायथन है) के व्यवहार को डुप्लिकेट करने का प्रयास करता है। profile डेटा को चलाने से संग्रहीत करने के लिए pstats का उपयोग करता है, और pstats केवल व्यक्तिगत पायथन विवरणों के लिए नहीं, फ़ंक्शन परिभाषाओं के लिए लाइन नंबर स्टोर करता है।

यदि आपको अपने पूरे समय क्या खा रहा है तो बेहतर ग्रैन्युलरिटी के साथ पता लगाने की आवश्यकता है, तो आपको अपने बड़े कार्यों को कई छोटे कार्यों में दोबारा करने की आवश्यकता है।

+0

छोटे कार्यों में पुन: सक्रिय करना हमेशा संभव नहीं होता है - और फ़िथन कॉल में पाइथन महंगा होता है, यह गति को एक महत्वपूर्ण तरीके से प्रभावित कर सकता है। –

+0

+1: छोटे हिस्सों में तोड़ना सबसे आसान तरीका है। इसके अलावा आप कुछ ब्लॉक को स्थानीय रूप से परिभाषित अस्थायी (प्रोफाइलिंग के लिए) कार्यों में लपेट सकते हैं। यह अलग-अलग स्थानों से अलग-अलग लेखांकन कॉल को उसी फ़ंक्शन पर भी अनुमति देगा। –

3

रॉबर्ट केर्न द्वारा लिखित पायथन में line profiler है।

+0

ऐसा लगता है कि मैं क्या देख रहा हूं ... हालांकि, मैं ओएसएक्स हिम तेंदुए पर स्थापित करने में असमर्थ हूं, क्योंकि यह 10.4 एसडीके (जो 10.6 पर नहीं है) की तलाश में है। इसे बदलने के लिए बिल्ड स्क्रिप्ट में संदर्भ नहीं मिल रहा है ... यदि यह "sudo python setup.py install" का उपयोग करते समय मुझे प्राप्त होने वाले सटीक त्रुटि संदेश में मदद करता है: एक एसडीके के साथ संकलित करना जो प्रतीत नहीं होता है मौजूद है:/डेवलपर/एसडीके/एमएसीओएसएक्स 10.4u.sdk –

+0

मुझे अपनी मैकबुक (बर्फ तेंदुए पर भी) पर यह समस्या नहीं है। मैं स्थापना के लिए सुडो का उपयोग करने के खिलाफ सलाह दूंगा, यह अक्सर एक बुरा विचार है (यह आपके सिस्टम पायथन को तोड़ सकता है, और सूडो आपके एनवी वैरिएबल को निर्यात नहीं करता है जैसा कि आप उम्मीद करेंगे)। मैं आपको इस समस्या को उत्साह-देव मेलिंग सूची पर लाने की सलाह दूंगा –