पायथन बफर प्रकार किसके लिए है?


136

bufferअजगर में एक प्रकार है, लेकिन मुझे नहीं पता कि मैं इसका उपयोग कैसे कर सकता हूं।

में अजगर दस्तावेज़ वर्णन है:

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

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

जवाबों:


145

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

>>> 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'

यह बहुत उपयोगी हो सकता है यदि आप डेटा पर एक से अधिक दृश्य रखना चाहते हैं और मेमोरी में कई प्रतियाँ नहीं (या नहीं) कर सकते हैं।

ध्यान दें कि पायथन 3 में bufferबेहतर नाम से प्रतिस्थापित किया गया है memoryview, हालांकि आप पायथन 2.7 में भी उपयोग कर सकते हैं।

यह भी ध्यान दें कि आप C API में बिना डिलिट किए अपनी खुद की वस्तुओं के लिए एक बफ़र इंटरफ़ेस लागू नहीं कर सकते, अर्थात आप इसे शुद्ध पायथन में नहीं कर सकते।


आपके व्याख्या के लिये धन्यवाद। लेकिन मुझे अभी भी समझ में नहीं आया है कि बफरिंग और सरल स्लाइसिंग में क्या अंतर है। उपयोग करने से s[6:11]अतिरिक्त संग्रहण स्थान नहीं मिलता है, क्या मैं गलत हूं?
सटोरू

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

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

स्मृति उपयोग के लिए उदाहरण के लिए stackoverflow.com/questions/110259 देखें । कभी-कभी यह आसान है कि टास्क मैनेजर / गतिविधि मॉनिटर / टॉप में पायथन का उपयोग देखें।
स्कॉट ग्रिफ़िथ

13
मेरे जैसे पायथन नोबस के लिए: पाइथन 3 में बफर मेमोरीव्यू है
डिर्क बेस्टर

25

मुझे लगता है कि बफ़र्स जैसे उपयोगी होते हैं जब देशी पुस्तकालयों में अजगर को नियंत्रित करते हैं। ( इस मेलिंगलिस्ट पोस्टbuffer में गुइडो वैन रोसुम बताते हैं )।

उदाहरण के लिए, कुशल डेटा स्टोरेज के लिए बफर का उपयोग करने में सुन्न लगता है:

import numpy
a = numpy.ndarray(1000000)

a.dataएक है:

<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.