एक उदाहरण उपयोग:
>>> s = 'Hello world'
>>> t = buffer(s, 6, 5)
>>> t
<read-only buffer for 0x10064a4b0, size 5, offset 6 at 0x100634ab0>
>>> print t
world
इस मामले में बफर, एक उप स्ट्रिंग है लंबाई 5 के साथ स्थिति 6 से शुरू, और यह अतिरिक्त भंडारण स्थान नहीं ले करता है - यह एक टुकड़ा का संदर्भ स्ट्रिंग का
यह इस तरह के छोटे तारों के लिए बहुत उपयोगी नहीं है, लेकिन बड़ी मात्रा में डेटा का उपयोग करते समय यह आवश्यक हो सकता है। यह उदाहरण एक परिवर्तनशील bytearray
उपयोग करता है:
>>> s = bytearray(1000000) # a million zeroed bytes
>>> t = buffer(s, 1) # slice cuts off the first byte
>>> s[1] = 5 # set the second element in s
>>> t[0] # which is now also the first element in t!
'\x05'
यह बहुत उपयोगी हो सकता है अगर आप डेटा पर एक से अधिक दृश्य करना चाहते हैं और नहीं करना चाहती है (या नहीं कर सकते हैं) की स्मृति में कई प्रतियां पकड़ो।
ध्यान दें कि buffer
, अजगर 3 में बेहतर memoryview
नामित ने ले लिया है, हालांकि आप या तो अजगर 2.7 में उपयोग कर सकते हैं।
ध्यान दें कि आप सीपीआई में बिना किसी त्रुटि के अपने बफर इंटरफेस को लागू नहीं कर सकते हैं, यानी आप इसे शुद्ध पायथन में नहीं कर सकते हैं।
स्रोत
2010-08-06 10:05:04
अपने स्पष्टीकरण के लिए धन्यवाद। लेकिन मैं अभी भी समझ में नहीं आता कि बफरिंग और सरल टुकड़ा करने के बीच क्या अंतर है। 'S [6:11] 'का उपयोग करके अतिरिक्त संग्रहण स्थान नहीं लेता है, क्या मैं गलत हूं? – satoru
आम तौर पर एक टुकड़ा अतिरिक्त भंडारण लेगा, इसलिए हाँ [6:11] 'एक प्रतिलिपि होगी। यदि आप 't = s [6:11] 'और फिर' del s' सेट करते हैं, तो यह उस स्मृति को मुक्त करता है जो' s' द्वारा लिया गया था, यह साबित करता था कि 't' की प्रतिलिपि बनाई गई थी। (इसे देखने के लिए आपको एक बड़ा 's 'चाहिए और पायथन के मेमोरी उपयोग को ट्रैक करें)। हालांकि इसमें अधिक डेटा शामिल नहीं होने पर प्रतिलिपि बनाने के लिए यह और अधिक कुशल है। –
धन्यवाद बहुत मश :) बीटीडब्लू, क्या आप कृपया मुझे बता सकते हैं कि पायथन के मेमोरी उपयोग को ट्रैक करने के लिए मैं किस टूल का उपयोग कर सकता हूं? – satoru