2010-08-06 9 views
5

मैं प्लॉटिंग कोड (matplotlib) की अंतर्निहित संरचना को अनुकूलित करने की कोशिश कर रहा हूं जिसे साप्ताहिक सरणी का उपयोग करने के लिए प्लॉट डेटा के लिए पाइथन सूचियों का उपयोग करने के लिए टाइमर पर अपडेट किया गया है। मैं जितना संभव हो सके साजिश के लिए समय कदम कम करने में सक्षम होना चाहता हूं, और चूंकि डेटा हजारों अंकों में हो सकता है, इसलिए मैं मूल्यवान समय तेज़ी से खोना शुरू कर सकता हूं अगर मैं नहीं कर सकता। मुझे पता है कि इस प्रकार की चीज़ के लिए numpy arrays को प्राथमिकता दी जाती है, लेकिन मुझे पाइथन प्रोग्रामर की तरह सोचने की आवश्यकता होने पर मुझे परेशानी हो रही है और जब मुझे सी ++ प्रोग्रामर की तरह सोचने की आवश्यकता है तो मेमोरी एक्सेस की मेरी दक्षता को अधिकतम करें।numpy सरणी के साथ पाइथोनिक कचरा संग्रह कैसे जोड़ता है और हटा देता है?

यह परिशिष्ट() फ़ंक्शन के लिए scipy.org दस्तावेज़ों में कहता है कि यह एक साथ संलग्न सरणी की प्रतिलिपि देता है। क्या इन सभी प्रतियों को कचरा इकट्ठा किया जाता है? उदाहरण के लिए:

import numpy as np 

a = np.arange(10) 
a = np.append(a,10) 
print a

यह वही सी ++ पर चल रहा है की मेरी पढ़ने है - स्तर है, लेकिन अगर मुझे पता था कि मैं क्या, मैं सवाल पूछने नहीं किया जाएगा बात कर रहा था, इसलिए मुझे सही करें अगर मैं 'मैं गलत हूं! = पी

पहले 10 पूर्णांक का एक ब्लॉक आवंटित किया जाता है, और प्रतीक उस ब्लॉक की शुरुआत के लिए एक बिंदु है। फिर 11 पूर्णांकों का एक नया ब्लॉक आवंटित किया जाता है, कुल 21 इंच (84 बाइट) का उपयोग किया जा रहा है। फिर एक सूचक को 11-इंट ब्लॉक की शुरुआत में ले जाया जाता है। मेरा अनुमान है कि इसके परिणामस्वरूप कचरा-संग्रह एल्गोरिदम 10-इंट ब्लॉक की संदर्भ संख्या को शून्य तक घटा देगा और इसे आवंटित करेगा। क्या यह सही है? यदि नहीं, तो मैं कैसे सुनिश्चित करूं कि मैं संलग्न होने पर ओवरहेड नहीं बनाऊं?

मुझे यह भी सुनिश्चित नहीं है कि जब मैं इसका उपयोग कर रहा हूं तो एक numpy सरणी को ठीक से कैसे हटाया जाए। मेरे पास मेरे भूखंडों पर एक रीसेट बटन है जो बस सभी डेटा को बाहर निकाल देता है और शुरू होता है। जब मेरी सूचियां थीं, तो यह del data[:] का उपयोग करके किया गया था। क्या numpy arrays के लिए एक समकक्ष कार्य है? या मुझे सिर्फ डेटा = np.array ([]) कहना चाहिए और मेरे लिए काम करने के लिए कचरा कलेक्टर पर भरोसा करना चाहिए?

उत्तर

10

स्वचालित मेमोरी प्रबंधन का बिंदु यह है कि आप इसके बारे में नहीं सोचते हैं। आपके द्वारा लिखे गए कोड में, प्रतियां कचरे से एकत्रित होंगी (यह पाइथन के स्मृति प्रबंधन को भ्रमित करने के लिए असंभव है)। हालांकि, क्योंकि np.append में जगह नहीं है, कोड स्मृति में एक नई सरणी (a और 10 के संयोजन से युक्त) और फिर चर a इस नई सरणी को इंगित करने के अद्यतन किया जाएगा पैदा करेगा। चूंकि a अब मूल सरणी को इंगित नहीं करता है, जिसमें 1 का रिफाउंट था, इसकी रीफॉउंट 0 तक घट जाती है और इसे स्वचालित रूप से साफ़ कर दिया जाएगा। पूर्ण सफाई को मजबूर करने के लिए आप gc.collect का उपयोग कर सकते हैं।

पायथन की ताकत ठीक-ट्यूनिंग मेमोरी एक्सेस में नहीं है, हालांकि इसे अनुकूलित करना संभव है। आप शायद a (उदा। a = np.zeros(<size>) का उपयोग करके) को पूर्व-आवंटित पूर्व-क्रमबद्ध कर रहे हैं; यदि आपको इससे बेहतर ट्यूनिंग की आवश्यकता है तो यह थोड़ा बालों वाली होनी शुरू हो जाती है। आप पाइथन के साथ दक्षता के लिए एकीकृत करने के लिए बहुत साफ और आसान तरीका के लिए Cython + Numpy tutorial पर एक नज़र डाल सकते हैं। अजगर में

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

+0

तो मूल रूप से मुझे ठंडा करने की आवश्यकता है। =) स्पष्टीकरण के लिए धन्यवाद, मैंने सोचा था कि कैसे चीजें काम किया, लेकिन मैं उस पर% नहीं 100 स्पष्ट था। – pr0crastin8r

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