2011-04-11 14 views
13

मुझे कुछ यादृच्छिक समय के लिए एक पायथन स्क्रिप्ट चलाने की आवश्यकता होगी, इसे रोकें, एक स्टैक ट्रेसबैक प्राप्त करें, और इसे रोक दें। मैंने ऐसा करने के लिए चारों ओर गुगल किया है, लेकिन मुझे कोई स्पष्ट समाधान नहीं दिख रहा है।क्या अजगर के लिए कोई सांख्यिकीय प्रोफाइलर है? यदि नहीं, तो मैं एक लिखने के बारे में कैसे जा सकता हूं?

+0

प्रोफाइलिंग के साथ क्या करना है? विशेष समस्या क्या है? –

+0

@RestRiciko: मुझे यकीन नहीं है कि आपका प्रश्न क्या है। मैं अजगर के लिए एक स्टोकास्टिक प्रोफाइलर खोजने या लिखने की कोशिश कर रहा हूं। – shino

+0

मुझे लगता है कि आपने "स्टोकास्टिक प्रोफाइलर" शब्द का आविष्कार किया था। ऐसा कुछ भी नहीं है - न तो पाइथन के लिए और न ही किसी अन्य भाषा के लिए। अपने आवेदन में यादृच्छिक ब्रेकपॉइंट्स डालने की संभावना प्रोग्राम * समस्या * की समस्या नहीं है। समय मॉड्यूल का उपयोग करके कुछ माप करना या सीधे ट्रेसबैक सहित सीधे आगे क्या है। इसे बिंदु पर लाने के लिए: सुंदर अस्पष्ट और अजीब सवाल। –

उत्तर

11

statprof module

pip install statprof (या easy_install statprof), तो उपयोग करने के लिए नहीं है

इसका महत्व क्यों होगा, हालांकि? पाइथन में पहले से ही दो अंतर्निर्मित प्रोफाइलर्स हैं: lsprof और लंबे समय से बहिष्कृत हॉटशॉट। Lsprof के साथ समस्या यह है कि यह केवल फ़ंक्शन कॉल ट्रैक करता है। यदि आपके पास फ़ंक्शन के भीतर कुछ गर्म लूप हैं, तो यह पता लगाने के लिए कि कौन सा वास्तव में महत्वपूर्ण है, lsprof लगभग बेकार है।

कुछ दिन पहले, मैंने खुद को उस स्थिति में पाया जहां एलएसप्रोफ विफल रहता है: यह मुझे बता रहा था कि मेरे पास एक गर्म कार्य था, लेकिन यह समारोह मेरे लिए अपरिचित था, और यह काफी लंबा था कि यह तुरंत स्पष्ट नहीं था जहां समस्या थी।

ट्विटर और Google+ पर भीख मांगने के बाद, किसी ने मुझे statprof पर इंगित किया। लेकिन एक समस्या थी: हालांकि यह सांख्यिकीय नमूना कर रहा था (यय!), यह नमूनाकरण (wtf !?) के दौरान केवल एक फ़ंक्शन की पहली पंक्ति को ट्रैक कर रहा था। तो मैंने इसे ठीक किया, दस्तावेज को छेड़छाड़ की, और अब यह दोनों प्रयोग योग्य और भ्रामक नहीं है। यहाँ इसके उत्पादन का एक उदाहरण है, और अधिक सही है कि गर्म समारोह में उल्लंघन करने लाइन लगाने:

% cumulative  self   
time seconds seconds name  
68.75  0.14  0.14 scmutil.py:546:revrange 
    6.25  0.01  0.01 cmdutil.py:1006:walkchangerevs 
    6.25  0.01  0.01 revlog.py:241:__init__ 
    [...blah blah blah...] 
    0.00  0.01  0.00 util.py:237:__get__ 
--- 
Sample count: 16 
Total time: 0.200000 seconds 

मैं अजगर पैकेज सूचकांक को statprof अपलोड कर दिया है, तो यह स्थापित करने के लिए लगभग तुच्छ है: "easy_install statprof" और आप कर रहे हैं अभी भी अच्छा चल रहा है।

the code is up on github के बाद से, कृपया बग रिपोर्ट और सुधारों का योगदान करने के लिए आपका स्वागत है। का आनंद लें!

+0

बकाया। मैं इसे थोड़ी देर के लिए चाहता था। – shino

5

मैं यह करने के कुछ तरीकों से जोड़ी के बारे में सोच सकते हैं:

  • बल्कि एक स्टैक ट्रेस जबकि कार्यक्रम चल रहा है पाने के लिए कोशिश कर रहा से, बस एक अवरोध इसे आग, और पार्स उत्पादन। आप इसे शेल स्क्रिप्ट या किसी अन्य पायथन स्क्रिप्ट के साथ कर सकते हैं जो आपके ऐप को उपप्रोसेस के रूप में आमंत्रित करता है। बुनियादी विचार समझाया गया है और this answer to a C++-specific question में पूरी तरह से बचाव किया गया है।

    • वास्तव में, बल्कि उत्पादन पार्स करने के लिए की तुलना में, आप एक शवपरीक्षा दिनचर्या (sys.excepthook का प्रयोग करके) कि स्टैक ट्रेस लॉग रजिस्टर कर सकते हैं। दुर्भाग्यवश, पाइथन के पास उस बिंदु से जारी रखने का कोई तरीका नहीं है जिस पर एक अपवाद हुआ, इसलिए आप लॉगिंग के बाद निष्पादन को फिर से शुरू नहीं कर सकते।
  • आदेश वास्तव में चल रहे एक कार्यक्रम से एक स्टैक ट्रेस पाने के लिए, आप कार्यान्वयन को हैक करने के लिए हो सकता होगा। तो यदि आप वास्तव में ऐसा करना चाहते हैं, तो pypy को देखने के लिए आपके समय के लायक हो सकता है, जो पाइथन में लिखे गए एक पायथन कार्यान्वयन है। मुझे नहीं पता कि यह पिल्ला में ऐसा करना कितना सुविधाजनक होगा। मैं अनुमान लगा रहा हूं कि यह विशेष रूप से सुविधाजनक नहीं होगा, क्योंकि इसमें मूल रूप से हर निर्देश में एक हुक पेश करना शामिल होगा, जो मुझे लगता है कि निषिद्ध रूप से अक्षम है। साथ ही, मुझे नहीं लगता कि पहले विकल्प पर बहुत फायदा होगा, जब तक कि उस राज्य तक पहुंचने में बहुत लंबा समय न हो, जहां आप स्टैक निशान करना शुरू करना चाहते हैं।

  • gdb डीबगर के लिए मौजूद है जो कि पाइथन को डीबग करने की सुविधा प्रदान करता है। जीडीबी बाहरी प्रक्रिया से जुड़ा हो सकता है (इस मामले में पाइथन का उदाहरण जो आपके आवेदन को निष्पादित कर रहा है) और, इसके साथ, इसके साथ बहुत कुछ भी करें। ऐसा लगता है कि मैक्रो pystack आपको निष्पादन के वर्तमान बिंदु पर पाइथन स्टैक का बैकट्रैक प्राप्त करेगा। मुझे लगता है कि इस प्रक्रिया को स्वचालित करना बहुत आसान होगा, क्योंकि आप expect या जो कुछ भी उपयोग कर सकते हैं, केवल gdb में पाठ को खिला सकते हैं।

+1

आपका दूसरा बिंदु दिलचस्प है। [आरपीडीबी 2] (http://winpdb.org/) (Winpdb के साथ शामिल) पाइथन प्रोग्राम मध्य निष्पादन को रोकने के लिए अनुमति देता है। आरपीडीबी 2 के माध्यम से प्रोग्राम को रोकना, स्टैक को डंप करना, और निष्पादन को फिर से शुरू करना स्वचालित हो सकता है। – gotgenes

+0

@gotgenes: अच्छा बिंदु। आपने मुझे एक विचार दिया .. – intuited

2

अजगर के लिए एक बाहरी सांख्यिकीय प्रोफाइलर को लागू करने के लिए आपको कुछ सामान्य डीबगिंग टूल आप किसी अन्य प्रक्रिया पूछताछ करते हैं कि, साथ ही कुछ अजगर विशिष्ट उपकरणों की आवश्यकता के लिए दुभाषिया राज्य के एक पकड़ पाने के लिए जा रहे हैं।

यह सामान्य रूप से एक आसान समस्या नहीं है, लेकिन आप जीडीबी 7 और संबंधित सीपीथन विश्लेषण उपकरण से शुरू करने का प्रयास करना चाह सकते हैं।

3

पायथन में आपके द्वारा वर्णित किए गए सभी कार्यों को पहले से ही शामिल किया गया है, दुभाषिया को हैक करने की आवश्यकता नहीं है।

आपको sys._current_frames() फ़ंक्शन के साथ traceback मॉड्यूल का उपयोग करना होगा। आपको बस अपनी इच्छित आवृत्ति पर आवश्यक ट्रेसबैक को डंप करने का एक तरीका है, उदाहरण के लिए यूनिक्स सिग्नल या अन्य थ्रेड का उपयोग करना।

अपने कोड कूद-शुरू में, आप कर सकते हैं कि वास्तव में क्या this commit में किया जाता है:

  1. कॉपी कि से threads.py मॉड्यूल के लिए प्रतिबद्ध, या कम से कम स्टैक ट्रेस डंपिंग समारोह (ZPL लाइसेंस, बहुत उदार):

  2. यह एक संकेत हैंडलर, कहने के लिए हुक अप, SIGUSR1

तो फिर तुम बस करने की जरूरत है अपने कोड को चलाएं और जितनी बार आपको आवश्यकता हो उतनी बार SIGUSR1 के साथ "मार दें"।

ऐसे मामले के लिए जहां एक ही थ्रेड का एक ही कार्य समय-समय पर एक ही तकनीक के साथ "नमूना" होता है, समय के लिए एक और थ्रेड का उपयोग करके, मैं Products.LongRequestLogger के कोड को विच्छेदन करने का सुझाव देता हूं और इसके परीक्षण (वास्तव में आपके द्वारा विकसित, जबकि Nexedi का काम) के तहत:

किया जाए या नहीं इस उचित "सांख्यिकीय" रूपरेखा है, Mike Dunlavey द्वारा answerintuited द्वारा संदर्भित एक सम्मोहक तर्क है कि यह एक बहुत शक्तिशाली "प्रदर्शन डिबगिंग" तकनीक है बनाता है, और मैं व्यक्तिगत है अनुभव है कि यह प्रदर्शन मुद्दों के वास्तविक कारणों पर जल्दी से ज़ूम में मदद करता है।

import statprof 

statprof.start() 
try: 
    my_questionable_function() 
finally: 
    statprof.stop() 
    statprof.display() 

वहाँ this blog post से मॉड्यूल पर पृष्ठभूमि का एक सा:

0

एक क्रॉस-प्लेटफार्म नमूनाकरण (सांख्यिकीय) पायथन प्रोफाइलर है जिसे vmprof-python कहा जाता है। पीपीपी टीम के सदस्यों द्वारा विकसित, यह पीपीपी के साथ ही सीपीथन का समर्थन करता है। यह लिनक्स, मैक ओएसएक्स, और विंडोज पर काम करता है। यह सी में लिखा गया है, इस प्रकार एक बहुत छोटा उपरि है। यह पाइथन कोड के साथ-साथ पाइथन कोड से बने देशी कॉल का प्रोफाइल करता है। इसके अलावा, फ़ंक्शन नामों के अतिरिक्त फ़ंक्शन के अंदर निष्पादन लाइनों के बारे में आंकड़े एकत्र करने के लिए इसका एक बहुत ही उपयोगी विकल्प है। यह मेमोरी उपयोग भी कर सकता है (ढेर आकार का पता लगाकर)।

इसे एपीआई या कंसोल से पायथन कोड से बुलाया जा सकता है। प्रोफ़ाइल डंप देखने के लिए एक वेब यूआई है: vmprof.com, जो open sourced भी है।

इसके अलावा, कुछ पायथन आईडीई (उदाहरण के लिए पायचर्म) के साथ एकीकरण है, जिससे प्रोफाइलर चलाने और संपादक में परिणाम देखने की अनुमति मिलती है।

संबंधित मुद्दे

 संबंधित मुद्दे