2010-12-28 11 views
21

मैं एक अच्छा ऐप्पल प्रोफाइलर का उपयोग करता था जो सिस्टम मॉनीटर एप्लिकेशन में बनाया गया है। जब तक आपका सी ++ कोड डीबग जानकारी के साथ संकलित किया गया था, तब तक आप अपने चल रहे एप्लिकेशन का नमूना दे सकते हैं और यह एक इंडेंट पेड़ प्रिंट करेगा जो आपको बताएगा कि इस फ़ंक्शन में पेरेंट फ़ंक्शन का समय किस प्रतिशत खर्च किया गया था (और शरीर बनाम अन्य फ़ंक्शन कॉल) ।आप पाइथन प्रोफाइलर्स के साथ कॉल पेड़ कैसे प्राप्त कर सकते हैं?

उदाहरण के लिए, मुख्य यदि function_1 और function_2 कहा जाता है, function_2 कॉल function_3, और फिर मुख्य कॉल function_3:

main (100%, 1% in function body): 
    function_1 (9%, 9% in function body): 
    function_2 (90%, 85% in function body): 
     function_3 (100%, 100% in function body) 
    function_3 (1%, 1% in function body) 

मैं इस को देखते हैं और सोचते हैं, "कुछ में कोड में एक लंबे समय ले जा रहा है function_2 का शरीर। यदि मैं चाहता हूं कि मेरा प्रोग्राम तेज़ी से हो, तो मुझे वह जगह शुरू करनी चाहिए। "

क्या कोई जानता है कि मैं आसानी से एक पाइथन प्रोग्राम के लिए यह सटीक प्रोफाइलिंग आउटपुट कैसे प्राप्त कर सकता हूं?

मैंने देखा है लोगों को यह करने के लिए कहते हैं:

import cProfile, pstats 
prof = cProfile.Profile() 
prof = prof.runctx("real_main(argv)", globals(), locals()) 
stats = pstats.Stats(prof) 
stats.sort_stats("time") # Or cumulative 
stats.print_stats(80) # 80 = how many to print 

लेकिन यह है कि सुरुचिपूर्ण कॉल पेड़ की तुलना में काफी गंदा है। अगर आप आसानी से ऐसा कर सकते हैं तो कृपया मुझे बताएं, इससे काफी मदद मिलेगी।

चीयर्स!

उत्तर

9

कॉल ग्राफ़ के लिए इस लाइब्रेरी http://pycallgraph.slowchop.com/ देखें। यह वास्तव में अच्छी तरह से काम करता है। यदि आप विशिष्ट कार्यों को प्रोफाइल करना चाहते हैं, तो http://mg.pov.lt/blog/profiling.html

यह प्रोफ़ाइलहुक मॉड्यूल का परिणाम है।

alt text

+0

क्या आप जानते हैं कि अगर इस पैकेज फ़ंक्शन कॉल के समय के साथ-साथ नंबर गुजरे कर सकते हैं? उदाहरण के लिए, मुझे हजारों बार __hash __() को कॉल करने में कोई दिक्कत नहीं होगी, लेकिन बड़े सूचियों पर बार-बार क्रमबद्ध कॉल करना काफी धीमा हो सकता है। – user

+0

आपको बस उन्हें दोनों को आजमाएं। वे मूल रूप से अलग-अलग तरीकों से अलग-अलग तरीकों से एक ही काम करते हैं। – Falmarri

+0

+1, पैकेज मेरे मन में जो कुछ था उसके साथ है और इंस्टॉल करने और कॉल करने के लिए तेज़ और आसान था। क्या आप मुझे बताते हैं कि आपको उपर्युक्त आंकड़ा कैसे मिला? मैंने ग्राफ बनाया है (pycallgraph.start_trace() और pycallgraph.make_dot_graph ('test.jpg', format = 'jpg', tool = 'neato') ) का उपयोग करके, लेकिन यह बहुत भीड़ में है और बहुत से फ़ंक्शन अस्पष्ट हैं। – user

15

मैं हाल ही में एक ही बात चाहता था, इसलिए अपने आप को एक को लागू करने पर एक चाकू ले लिया।

परियोजना गीथूब पर है। https://github.com/joerick/pyinstrument

यहाँ कैसे आप इसका इस्तेमाल होता है:

from pyinstrument import Profiler 

profiler = Profiler() 
profiler.start() 

# code you want to profile 

profiler.stop() 

print(profiler.output_text()) 
+1

यह शानदार है, धन्यवाद! – Maximilian

+0

यह अच्छा लगता है, यहां एक जेनेरिक लाइब्रेरी है: https://github.com/vmprof/vmprof-python – dashesy

+1

यह वास्तव में अच्छा है, धन्यवाद! – Dakkaron

38

मैं बस के रूप में अच्छी तरह से इस पर ठोकर खाई है, और कुछ समय बिताया कैसे एक फोन ग्राफ (cProfile के सामान्य परिणाम बहुत जानकारीपूर्ण नहीं है) उत्पन्न करने के लिए सीखने। भविष्य संदर्भ, cProfile + gprof2dot + graphViz के साथ एक सुंदर कॉल-पेड़ ग्राफिक उत्पन्न करने का एक और तरीका है।

-------

  1. स्थापित Graphviz: कोड पर http://www.graphviz.org/Download_macos.php
  2. easy_install gprof2dot
  3. भागो प्रोफ़ाइल।

    python -m cProfile -o myLog.profile <myScript.py> arg1 arg2 ... 
    
  4. भागो gprof2dot एक डॉट फ़ाइल

    gprof2dot -f pstats myLog.profile -o callingGraph.dot 
    
  5. Graphviz के साथ ओपन में कॉल प्रोफ़ाइल कन्वर्ट करने के लिए ग्राफ

यहाँ अंतिम परिणाम कैसे दिखाई देते हैं जाएगा कल्पना करने के लिए! ग्राफ रंग-कोडित है- लाल का मतलब समय की उच्च सांद्रता है।

Graph is color-coded- red means higher concentration of time

+4

[xdot] (https://pypi.python.org/pypi/xdot) .dot फ़ाइलों के लिए एक अच्छा इंटरैक्टिव दर्शक है जो आपको सामानों पर ज़ूम इन करने देता है। –

+2

चरण 5 के स्थान पर "डॉट कॉलिंगग्राफ डॉट-टीपीएनजी | डिस्प्ले" जैसे शेल कमांड के साथ यूनिक्स पर .dot फ़ाइल प्रदर्शित कर सकते हैं। – benjimin

+1

ग्रेट उत्तर, बिल्कुल जो मैं ढूंढ रहा था, धन्यवाद! –

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

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