2012-06-12 9 views
16

मेरे पास एक बहुत बड़ी पायथन लिपि, 200K है, कि मैं जितनी संभव हो उतनी छोटी मेमोरी का उपयोग करना चाहूंगा।पायथन स्क्रिप्ट मेमोरी उपयोग को कम करने के लिए कैसे करें

# a lot of data structures 
r = [34, 78, 43, 12, 99] 

# a lot of functions that I use all the time 
def func1(word): 
    return len(word) + 2 

# a lot of functions that I rarely use 
def func1(word): 
    return len(word) + 2 


# my main loop 
while 1: 
    # lots of code 
    # calls functions 

अगर मैं कार्यों है कि मैं शायद ही कभी एक मॉड्यूल में उपयोग करते हैं, और उन्हें गतिशील रूप से आयात केवल यदि आवश्यक हो तो, मैं डेटा का उपयोग नहीं कर सकते हैं डाल दिया: यह तरह दिखता है। जहां तक ​​मुझे मिल गया है।

मैं अजगर में नया हूं।

क्या कोई मुझे सही रास्ते पर रख सकता है? मैं इस बड़ी लिपि को कैसे तोड़ सकता हूं ताकि यह कम स्मृति का उपयोग कर सके? क्या मॉड्यूल में शायद ही कभी इस्तेमाल किया जाने वाला कोड डालने लायक है और केवल आवश्यकता होने पर उन्हें बुला रहा है?

+4

पर कुछ थोड़ा दिनांकित सलाह है क्या आप वाकई * बहुत अधिक * स्मृति का उपयोग करते हैं? – eumiro

+5

क्या आपने अपना कोड प्रोफाइल किया है? – Daenyth

+1

याद रखें कि "समयपूर्व अनुकूलन सभी बुराइयों की जड़ है"। – Amr

उत्तर

2

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

@ eumiro का सवाल सही है: क्या आप सुनिश्चित हैं कि आपकी स्क्रिप्ट बहुत अधिक स्मृति का उपयोग करती है? यह कितनी मेमोरी का उपयोग करता है, और यह बहुत अधिक क्यों है?

22

Organzing:

आपका अजगर स्क्रिप्ट वास्तव में लगता है बहुत बड़ा हो सकता है, हो सकता है आप कई modules or packages में में विभाजित करने के लिए पहली बार अपने कोड का पुनर्गठन पर विचार करना चाहिए, । यह शायद कोड प्रोफाइलिंग और अनुकूलन कार्यों को आसान बना देगा।

आप देखने के लिए चाहते हो सकता है:

और संभवतः:

अनुकूलन:

वहाँ चीजें हैं जो अपने कोड के अनुकूलन के लिए किया जा सकता है की एक बहुत कुछ है ...

उदाहरण के लिए, अपने डेटा संरचनाओं के बारे में ... यदि आप सूचियों या सूचियों की सूची का बड़ा उपयोग करते हैं, तो आप यह पता लगाने की कोशिश कर सकते हैं कि आपको वास्तव में सूचियों की आवश्यकता है, और जहां उन्हें गैर-परिवर्तनीय डेटा संरचना द्वारा प्रतिस्थापित किया जा सकता है ट्यूपल्स या "अस्थिर" ऑब्जेक्ट्स, "आलसी" कंटेनर जैसे जेनरेटर एक्सप्रेशन की तरह।

देखें:

इसके अलावा, आप काम करने के लिए अपने तरीके का अध्ययन करने और आश्चर्य है कि ऐसा करने के लिए कम लालच से एक तरह से, एक तरह से है कि यह बेहतर है है कि क्या वहाँ जाना चाहिए इसे पायथन में करें (आपको pythonic टैग में कुछ सुझाव मिलेगा) ... यह पाइथन में विशेष रूप से सच है, क्योंकि पाइथन में अक्सर एक "स्पष्ट" तरीका (और केवल एक) बेहतर होता है जो बेहतर होता है इसके अलावा एस (The Zen of Python देखें), जिसे पायथनिक कहा जाता है। यह विशेष रूप से आपके कोड के आकार से संबंधित नहीं है, बल्कि - और सभी के ऊपर - प्रदर्शन के लिए। कई भाषाओं के विपरीत, जो इस विचार को बढ़ावा देते हैं कि कुछ भी करने के कई तरीके हो सकते हैं, पायथन केवल सर्वोत्तम तरीके पर ध्यान केंद्रित करना पसंद करते हैं। तो जाहिर है, कुछ करने के कई तरीके हैं, लेकिन अक्सर, वास्तव में बेहतर है।

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

लेकिन आखिरकार, यह आपके कोड पर निर्भर करता है इसे देखे बिना जवाब देना मुश्किल है।

और, eumiro और Amr द्वारा किए गए टिप्पणियों को ध्यान में रखना सुनिश्चित करें।

+0

क्या आपको पाइथन कोड के कुछ स्निपेट मेमोरी की मात्रा निर्धारित करने के किसी भी अच्छे तरीके से पता है? गति तुलना के लिए 'टाइमिट' का उपयोग करना आसान है, इसलिए मैं कुछ ऐसी चीज़ ढूंढ रहा हूं जो मुझे स्मृति खपत को निर्धारित/विशेषता दे सके। अगर कुछ सरल है तो बस उत्सुक है। – Levon

+2

[memory_profiler] (http://pypi.python.org/pypi/memory_profiler) त्वरित डिबगिंग के लिए उपयोग करने में आसान, उपयोगी है। अब आप कोशिश कर सकते हैं [meliae] (https://code.launchpad.net/meliae) ([चरण-दर-चरण कैसे करें] (http://jam-bazaar.blogspot.ie/2010/08/step- by-step-meliae.html)), या [हेपी] (http://guppy-pe.sourceforge.net/#Heapy) अधिक पूर्ण समाधान के लिए। अच्छी चर्चा [यहां] (http://stackoverflow.com/questions/110259/python-memory-profiler) और कुछ इंटरस्टेस्टिंग अनुमान विधियां [यहां] (http://stackoverflow.com/questions/563840/how-can-i -चेक-द-मेमोरी-यूज-ऑब्जेक्ट्स-इन-आईपीथॉन) – cedbeu

+0

मुझे लगता है कि आप [memory_profiler] (http://pypi.python.org/pypi/memory_profiler) मॉड्यूल जैसे कुछ की तलाश कर रहे हैं, मैंने उल्लेख किया है, हालांकि। – cedbeu

3

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

संयोग से, आप उल्लेख करते हैं कि आपके पास अपनी स्क्रिप्ट के शीर्ष पर परिभाषित बहुत से डेटा संरचनाएं हैं, जिसका अर्थ है कि वे सभी शुरुआत में स्मृति में लोड हो गए हैं। यदि यह एक बहुत बड़ा डेटासेट है, तो विशिष्ट डेटासेट को फ़ाइलों को अलग करने के लिए आगे बढ़ने पर विचार करें, और इसे आवश्यकतानुसार लोड करें। (csv मॉड्यूल का उपयोग करके, या numpy.loadtxt(), आदि)

कम स्मृति का उपयोग करने से अलग, स्मृति का अधिक कुशलतापूर्वक उपयोग करने के तरीकों को भी देखें। उदाहरण के लिए, संख्यात्मक डेटा के बड़े सेट के लिए, numpy arrays जानकारी संग्रहीत करने का एक तरीका है जो आपकी गणनाओं में बेहतर प्रदर्शन प्रदान करेगा। http://wiki.python.org/moin/PythonSpeed/PerformanceTips

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