2010-08-06 12 views
118

पाइथन में buffer प्रकार है, लेकिन मुझे नहीं पता कि मैं इसका उपयोग कैसे कर सकता हूं।पाइथन बफर प्रकार क्या है?

Python doc में वर्णन है:

buffer(object[, offset[, size]])

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

उत्तर

120

एक उदाहरण उपयोग:

>>> 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 में उपयोग कर सकते हैं।

ध्यान दें कि आप सीपीआई में बिना किसी त्रुटि के अपने बफर इंटरफेस को लागू नहीं कर सकते हैं, यानी आप इसे शुद्ध पायथन में नहीं कर सकते हैं।

+0

अपने स्पष्टीकरण के लिए धन्यवाद। लेकिन मैं अभी भी समझ में नहीं आता कि बफरिंग और सरल टुकड़ा करने के बीच क्या अंतर है। 'S [6:11] 'का उपयोग करके अतिरिक्त संग्रहण स्थान नहीं लेता है, क्या मैं गलत हूं? – satoru

+8

आम तौर पर एक टुकड़ा अतिरिक्त भंडारण लेगा, इसलिए हाँ [6:11] 'एक प्रतिलिपि होगी। यदि आप 't = s [6:11] 'और फिर' del s' सेट करते हैं, तो यह उस स्मृति को मुक्त करता है जो' s' द्वारा लिया गया था, यह साबित करता था कि 't' की प्रतिलिपि बनाई गई थी। (इसे देखने के लिए आपको एक बड़ा 's 'चाहिए और पायथन के मेमोरी उपयोग को ट्रैक करें)। हालांकि इसमें अधिक डेटा शामिल नहीं होने पर प्रतिलिपि बनाने के लिए यह और अधिक कुशल है। –

+0

धन्यवाद बहुत मश :) बीटीडब्लू, क्या आप कृपया मुझे बता सकते हैं कि पायथन के मेमोरी उपयोग को ट्रैक करने के लिए मैं किस टूल का उपयोग कर सकता हूं? – satoru

21

मुझे लगता है कि बफर उदा। मूल पुस्तकालयों में पाइथन इंटरफेस करते समय उपयोगी। (Guido वैन Rossum bufferthis mailinglist post में बताते हैं)।

उदाहरण के लिए, numpy कुशल आंकड़ा भंडारण के लिए बफर उपयोग करने के लिए लगता है:

import numpy 
a = numpy.ndarray(1000000) 

a.data है एक:

<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0> 
+0

मेलिंग सूची निश्चित रूप से पढ़ने के लायक है। – Robino

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