python - कौन सा पायथन स्मृति प्रोफाइलर की सिफारिश की जाती है?




performance memory-management (6)

मैं अपने पायथन एप्लिकेशन के मेमोरी उपयोग को जानना चाहता हूं और विशेष रूप से जानना चाहता हूं कि कौन से कोड ब्लॉक / भाग या ऑब्जेक्ट्स अधिकांश मेमोरी का उपभोग कर रहे हैं। Google खोज एक वाणिज्यिक दिखाता है एक पाइथन मेमोरी वैलिडेटर (केवल विंडोज़) है।

और ओपन सोर्स वाले PySizer और Heapy

मैंने किसी की कोशिश नहीं की है, इसलिए मैं जानना चाहता था कि कौन सा सबसे अच्छा विचार कर रहा है:

  1. अधिकांश विवरण देता है।

  2. मुझे अपने कोड में कम से कम या कोई बदलाव नहीं करना है।


चूंकि किसी ने इसका उल्लेख नहीं किया है, इसलिए मैं अपने मॉड्यूल memory_profiler को इंगित memory_profiler जो यूनिक्स और विंडोज़ पर स्मृति उपयोग और कार्यों के लाइन-बाय-लाइन रिपोर्ट को प्रिंट करने में सक्षम है (इस अंतिम पर psutil की आवश्यकता है)। आउटपुट बहुत विस्तृत नहीं है लेकिन लक्ष्य आपको एक सिंहावलोकन देना है कि कोड कहां से अधिक स्मृति ले रहा है और आवंटित वस्तुओं पर एक संपूर्ण विश्लेषण नहीं है।

@profile साथ अपने फ़ंक्शन को सजाने के बाद और -m memory_profiler ध्वज के साथ अपना कोड चलाकर यह इस तरह की लाइन-बाय-लाइन रिपोर्ट प्रिंट करेगा:

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a

मैं Dowser की सलाह देता हूं। सेटअप करना बहुत आसान है, और आपको अपने कोड में शून्य परिवर्तन की आवश्यकता है। आप समय के माध्यम से प्रत्येक प्रकार की वस्तुओं की संख्या देख सकते हैं, लाइव ऑब्जेक्ट्स की सूची देख सकते हैं, लाइव ऑब्जेक्ट्स के संदर्भ देख सकते हैं, सब कुछ सरल वेब इंटरफ़ेस से।

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.server.quickstart()
    cherrypy.engine.start(blocking=False)

आप memdebug आयात करते हैं, और memdebug.start पर कॉल करें। बस इतना ही।

मैंने पायसाइज़र या हेपी की कोशिश नहीं की है। मैं दूसरों की समीक्षा की सराहना करता हूं।

अद्यतन करें

उपरोक्त कोड CherryPy 2.X , CherryPy 3.X server.quickstart विधि को हटा दिया गया है और engine.start blocking ध्वज नहीं लेता है। तो यदि आप CherryPy 3.X का उपयोग कर रहे हैं

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.engine.start()

मैंने meliae को हेपी या पायसाइज़र की तुलना में अधिक कार्यात्मक पाया। यदि आप wsgi वेबपैप चला रहे हैं, तो Dozer Dowser का एक अच्छा मिडलवेयर रैपर है


Heapy का उपयोग करने के लिए काफी आसान है। आपके कोड में किसी बिंदु पर, आपको निम्न लिखना होगा:

from guppy import hpy
h = hpy()
print h.heap()

यह आपको इस तरह के कुछ आउटपुट देता है:

Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
0  35144  27  2140412  26   2140412  26 str
1  38397  29  1309020  16   3449432  42 tuple
2    530   0   739856   9   4189288  50 dict (no owner)

आप ऑब्जेक्ट्स के संदर्भ में कहां से संदर्भित कर सकते हैं और इसके बारे में आंकड़े प्राप्त कर सकते हैं, लेकिन किसी भी तरह से उस पर दस्तावेज़ थोड़ा सा स्पैस हैं।

एक ग्राफिकल ब्राउज़र भी है, जिसमें लिखा गया है।


Muppy (अभी तक एक और) पाइथन के लिए मेमोरी उपयोग प्रोफाइलर है। इस टूलसेट का फोकस मेमोरी लीक की पहचान पर रखा गया है।

मप्पी डेवलपर्स को पायथन अनुप्रयोगों की पहचान मेमोरी लीक में मदद करने की कोशिश करता है। यह रनटाइम के दौरान स्मृति उपयोग की ट्रैकिंग और लीकिंग वाली वस्तुओं की पहचान को सक्षम बनाता है। इसके अतिरिक्त, उपकरण प्रदान किए जाते हैं जो जारी किए गए ऑब्जेक्ट्स के स्रोत का पता लगाने की अनुमति नहीं देते हैं।


Pytracemalloc प्रोजेक्ट भी आज़माएं जो प्रति पायथन लाइन नंबर मेमोरी उपयोग प्रदान करता है।

संपादित करें (2014/04): स्नैपशॉट का विश्लेषण करने के लिए अब इसमें एक क्यूटी जीयूआई है।





profiling