मुझे कुछ यादृच्छिक समय के लिए एक पायथन स्क्रिप्ट चलाने की आवश्यकता होगी, इसे रोकें, एक स्टैक ट्रेसबैक प्राप्त करें, और इसे रोक दें। मैंने ऐसा करने के लिए चारों ओर गुगल किया है, लेकिन मुझे कोई स्पष्ट समाधान नहीं दिख रहा है।क्या अजगर के लिए कोई सांख्यिकीय प्रोफाइलर है? यदि नहीं, तो मैं एक लिखने के बारे में कैसे जा सकता हूं?
उत्तर
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 के बाद से, कृपया बग रिपोर्ट और सुधारों का योगदान करने के लिए आपका स्वागत है। का आनंद लें!
बकाया। मैं इसे थोड़ी देर के लिए चाहता था। – shino
मैं यह करने के कुछ तरीकों से जोड़ी के बारे में सोच सकते हैं:
बल्कि एक स्टैक ट्रेस जबकि कार्यक्रम चल रहा है पाने के लिए कोशिश कर रहा से, बस एक अवरोध इसे आग, और पार्स उत्पादन। आप इसे शेल स्क्रिप्ट या किसी अन्य पायथन स्क्रिप्ट के साथ कर सकते हैं जो आपके ऐप को उपप्रोसेस के रूप में आमंत्रित करता है। बुनियादी विचार समझाया गया है और this answer to a C++-specific question में पूरी तरह से बचाव किया गया है।
- वास्तव में, बल्कि उत्पादन पार्स करने के लिए की तुलना में, आप एक शवपरीक्षा दिनचर्या (
sys.excepthook
का प्रयोग करके) कि स्टैक ट्रेस लॉग रजिस्टर कर सकते हैं। दुर्भाग्यवश, पाइथन के पास उस बिंदु से जारी रखने का कोई तरीका नहीं है जिस पर एक अपवाद हुआ, इसलिए आप लॉगिंग के बाद निष्पादन को फिर से शुरू नहीं कर सकते।
- वास्तव में, बल्कि उत्पादन पार्स करने के लिए की तुलना में, आप एक शवपरीक्षा दिनचर्या (
आदेश वास्तव में चल रहे एक कार्यक्रम से एक स्टैक ट्रेस पाने के लिए, आप
कार्यान्वयन को हैक करने के लिए हो सकता होगा। तो यदि आप वास्तव में ऐसा करना चाहते हैं, तो pypy को देखने के लिए आपके समय के लायक हो सकता है, जो पाइथन में लिखे गए एक पायथन कार्यान्वयन है। मुझे नहीं पता कि यह पिल्ला में ऐसा करना कितना सुविधाजनक होगा। मैं अनुमान लगा रहा हूं कि यह विशेष रूप से सुविधाजनक नहीं होगा, क्योंकि इसमें मूल रूप से हर निर्देश में एक हुक पेश करना शामिल होगा, जो मुझे लगता है कि निषिद्ध रूप से अक्षम है। साथ ही, मुझे नहीं लगता कि पहले विकल्प पर बहुत फायदा होगा, जब तक कि उस राज्य तक पहुंचने में बहुत लंबा समय न हो, जहां आप स्टैक निशान करना शुरू करना चाहते हैं।gdb
डीबगर के लिए मौजूद है जो कि पाइथन को डीबग करने की सुविधा प्रदान करता है। जीडीबी बाहरी प्रक्रिया से जुड़ा हो सकता है (इस मामले में पाइथन का उदाहरण जो आपके आवेदन को निष्पादित कर रहा है) और, इसके साथ, इसके साथ बहुत कुछ भी करें। ऐसा लगता है कि मैक्रोpystack
आपको निष्पादन के वर्तमान बिंदु पर पाइथन स्टैक का बैकट्रैक प्राप्त करेगा। मुझे लगता है कि इस प्रक्रिया को स्वचालित करना बहुत आसान होगा, क्योंकि आपexpect
या जो कुछ भी उपयोग कर सकते हैं, केवलgdb
में पाठ को खिला सकते हैं।
आपका दूसरा बिंदु दिलचस्प है। [आरपीडीबी 2] (http://winpdb.org/) (Winpdb के साथ शामिल) पाइथन प्रोग्राम मध्य निष्पादन को रोकने के लिए अनुमति देता है। आरपीडीबी 2 के माध्यम से प्रोग्राम को रोकना, स्टैक को डंप करना, और निष्पादन को फिर से शुरू करना स्वचालित हो सकता है। – gotgenes
@gotgenes: अच्छा बिंदु। आपने मुझे एक विचार दिया .. – intuited
अजगर के लिए एक बाहरी सांख्यिकीय प्रोफाइलर को लागू करने के लिए आपको कुछ सामान्य डीबगिंग टूल आप किसी अन्य प्रक्रिया पूछताछ करते हैं कि, साथ ही कुछ अजगर विशिष्ट उपकरणों की आवश्यकता के लिए दुभाषिया राज्य के एक पकड़ पाने के लिए जा रहे हैं।
यह सामान्य रूप से एक आसान समस्या नहीं है, लेकिन आप जीडीबी 7 और संबंधित सीपीथन विश्लेषण उपकरण से शुरू करने का प्रयास करना चाह सकते हैं।
पायथन में आपके द्वारा वर्णित किए गए सभी कार्यों को पहले से ही शामिल किया गया है, दुभाषिया को हैक करने की आवश्यकता नहीं है।
आपको sys._current_frames()
फ़ंक्शन के साथ traceback
मॉड्यूल का उपयोग करना होगा। आपको बस अपनी इच्छित आवृत्ति पर आवश्यक ट्रेसबैक को डंप करने का एक तरीका है, उदाहरण के लिए यूनिक्स सिग्नल या अन्य थ्रेड का उपयोग करना।
अपने कोड कूद-शुरू में, आप कर सकते हैं कि वास्तव में क्या this commit में किया जाता है:
कॉपी कि से
threads.py
मॉड्यूल के लिए प्रतिबद्ध, या कम से कम स्टैक ट्रेस डंपिंग समारोह (ZPL लाइसेंस, बहुत उदार):यह एक संकेत हैंडलर, कहने के लिए हुक अप,
SIGUSR1
तो फिर तुम बस करने की जरूरत है अपने कोड को चलाएं और जितनी बार आपको आवश्यकता हो उतनी बार SIGUSR1 के साथ "मार दें"।
ऐसे मामले के लिए जहां एक ही थ्रेड का एक ही कार्य समय-समय पर एक ही तकनीक के साथ "नमूना" होता है, समय के लिए एक और थ्रेड का उपयोग करके, मैं Products.LongRequestLogger के कोड को विच्छेदन करने का सुझाव देता हूं और इसके परीक्षण (वास्तव में आपके द्वारा विकसित, जबकि Nexedi का काम) के तहत:
किया जाए या नहीं इस उचित "सांख्यिकीय" रूपरेखा है, Mike Dunlavey द्वारा answerintuited द्वारा संदर्भित एक सम्मोहक तर्क है कि यह एक बहुत शक्तिशाली "प्रदर्शन डिबगिंग" तकनीक है बनाता है, और मैं व्यक्तिगत है अनुभव है कि यह प्रदर्शन मुद्दों के वास्तविक कारणों पर जल्दी से ज़ूम में मदद करता है।
import statprof
statprof.start()
try:
my_questionable_function()
finally:
statprof.stop()
statprof.display()
वहाँ this blog post से मॉड्यूल पर पृष्ठभूमि का एक सा:
एक क्रॉस-प्लेटफार्म नमूनाकरण (सांख्यिकीय) पायथन प्रोफाइलर है जिसे vmprof-python कहा जाता है। पीपीपी टीम के सदस्यों द्वारा विकसित, यह पीपीपी के साथ ही सीपीथन का समर्थन करता है। यह लिनक्स, मैक ओएसएक्स, और विंडोज पर काम करता है। यह सी में लिखा गया है, इस प्रकार एक बहुत छोटा उपरि है। यह पाइथन कोड के साथ-साथ पाइथन कोड से बने देशी कॉल का प्रोफाइल करता है। इसके अलावा, फ़ंक्शन नामों के अतिरिक्त फ़ंक्शन के अंदर निष्पादन लाइनों के बारे में आंकड़े एकत्र करने के लिए इसका एक बहुत ही उपयोगी विकल्प है। यह मेमोरी उपयोग भी कर सकता है (ढेर आकार का पता लगाकर)।
इसे एपीआई या कंसोल से पायथन कोड से बुलाया जा सकता है। प्रोफ़ाइल डंप देखने के लिए एक वेब यूआई है: vmprof.com, जो open sourced भी है।
इसके अलावा, कुछ पायथन आईडीई (उदाहरण के लिए पायचर्म) के साथ एकीकरण है, जिससे प्रोफाइलर चलाने और संपादक में परिणाम देखने की अनुमति मिलती है।
- 1. यदि कोई निर्देशिका लिखने योग्य है तो परीक्षण करने के लिए मैं डेल्फी का उपयोग कैसे कर सकता हूं?
- 2. यदि कोई फ़ंक्शन एक इंटरेस्ट लौटाता है, तो क्या इसे एक इंट सौंपा जा सकता है?
- 3. यदि मॉडलस्टेट में कोई कुंजी मौजूद नहीं है, तो मैं इसे कैसे जोड़ सकता हूं? aspnetmvc1
- 4. यदि मैं अस्तित्व में नहीं हूं तो मैं वीबी में फ़ोल्डर कैसे बना सकता हूं?
- 5. यदि कोई सरणी 0 (या झूठी) है तो क्या मैं सी (++) में जांच सकता हूं?
- 6. यदि एमएस चार्ट नियंत्रण में कोई डेटा नहीं है तो क्या मैं एक संदेश प्रदर्शित कर सकता हूं?
- 7. यदि यह मौजूद नहीं है तो कोई सरणी में कोई तत्व पुश करें (कोई डुप्लीकेट नहीं)
- 8. क्या Python2.7 के लिए कोई स्मृति प्रोफाइलर है?
- 9. क्या Django के लिए कोई सांख्यिकीय/विश्लेषणात्मक ऐप्स हैं?
- 10. क्या मैं एक PHP फ़ंक्शन के अंदर जावास्क्रिप्ट अलर्ट जोड़ सकता हूं? यदि हां, तो कैसे?
- 11. मैं प्रोजेक्ट चश्मे लिखने के बारे में कैसे जान सकता हूं?
- 12. गोपनीयता यूआरएल के बारे में मैं क्या कर सकता हूं?
- 13. यदि टीएक्स एक प्रोग्रामिंग भाषा है, तो मैं टीएक्स में प्रोग्रामिंग कैसे शुरू कर सकता हूं?
- 14. यदि कोई आइटम समूह में कोई आइटम है तो मैं एमएसबिल्ड कंडीशन परीक्षण कैसे कर सकता हूं?
- 15. गिना जा रहा है, तो तारीख अजगर
- 16. एंड्रॉइड में ArrayAdapter थ्रेड सुरक्षित है? यदि नहीं, तो इसे धागा सुरक्षित बनाने के लिए मैं क्या कर सकता हूं?
- 17. क्या मैं एक आईस्ट्रीम पूछ सकता हूं यदि यह लिखने योग्य है?
- 18. कुछ पदों के लिए एक कुशल सामग्री फ़िल्टर बनाने के बारे में मैं कैसे जा सकता हूं?
- 19. मैं अपने क्यूए विभाग के लिए एक परीक्षण योजना बनाने के बारे में कैसे जा सकता हूं?
- 20. मैं Emacs में एक अजगर दुभाषिया कैसे चला सकता हूं?
- 21. यदि डेटासोर्स में कोई आइटम नहीं है तो मैं ASP.NET C# में दोहराने वाला कैसे छिपा सकता हूं?
- 22. यूआई के बारे में MEF है? यदि नहीं, तो जीयूआई संरचना के बारे में सभी उदाहरण क्यों हैं?
- 23. मैं इस गिट संघर्ष को हल करने के बारे में कैसे जा सकता हूं?
- 24. यदि कोई सीके संपादक फ़ील्ड खाली है तो मैं कैसे परीक्षण कर सकता हूं
- 25. यदि मैं ssh-ing के बिना मौजूद नहीं है तो मैं दूरस्थ होस्ट पर निर्देशिका कैसे बना सकता हूं?
- 26. क्या मैं एक कस्टम कंपाइलर त्रुटि उत्पन्न कर सकता हूं? यदि हां, तो कैसे?
- 27. यदि मैं मुख्य रूप लोड नहीं करना चाहता हूं तो मैं Winforms में कमांड लाइन तर्क कैसे संभाल सकता हूं?
- 28. मैं एक अलग उपयोगकर्ता के रूप में MySQL लिखने के आउटफाइल कैसे कर सकता हूं?
- 29. यदि ब्राउज़र में कोई निश्चित शब्द टाइप किया गया है, तो मैं JQuery के साथ कैसे जांच सकता हूं?
- 30. यदि अजगर में तारों के लिए कथन?
प्रोफाइलिंग के साथ क्या करना है? विशेष समस्या क्या है? –
@RestRiciko: मुझे यकीन नहीं है कि आपका प्रश्न क्या है। मैं अजगर के लिए एक स्टोकास्टिक प्रोफाइलर खोजने या लिखने की कोशिश कर रहा हूं। – shino
मुझे लगता है कि आपने "स्टोकास्टिक प्रोफाइलर" शब्द का आविष्कार किया था। ऐसा कुछ भी नहीं है - न तो पाइथन के लिए और न ही किसी अन्य भाषा के लिए। अपने आवेदन में यादृच्छिक ब्रेकपॉइंट्स डालने की संभावना प्रोग्राम * समस्या * की समस्या नहीं है। समय मॉड्यूल का उपयोग करके कुछ माप करना या सीधे ट्रेसबैक सहित सीधे आगे क्या है। इसे बिंदु पर लाने के लिए: सुंदर अस्पष्ट और अजीब सवाल। –