मेमोरीव्यू पर प्रलेखन की जाँच :
मेमोरीव्यू ऑब्जेक्ट्स पायथन कोड को किसी ऑब्जेक्ट के आंतरिक डेटा तक पहुंचने की अनुमति देता है जो कॉपी किए बिना बफर प्रोटोकॉल का समर्थन करता है।
वर्ग मेमोरीव्यू (obj)
एक मेमोरीव्यू बनाएं जो संदर्भों को संदर्भित करता है। obj बफर प्रोटोकॉल का समर्थन करना चाहिए। बफर प्रोटोकॉल का समर्थन करने वाली निर्मित वस्तुएं बाइट्स और बायट्रेयर शामिल हैं।
फिर हमें नमूना कोड दिया जाता है:
>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'
उद्धरण पर अब, एक करीब देखो ले:
>>> b = b'long bytes stream'
>>> b.startswith(b'long')
True
>>> v = memoryview(b)
>>> vsub = v[5:]
>>> vsub.startswith(b'bytes')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'memoryview' object has no attribute 'startswith'
>>> bytes(vsub).startswith(b'bytes')
True
>>>
तो मैं ऊपर से क्या इकट्ठा करता हूं:
हम कॉपी किए बिना बफर ऑब्जेक्ट के आंतरिक डेटा को उजागर करने के लिए एक मेमोरीव्यू ऑब्जेक्ट बनाते हैं, हालांकि, ऑब्जेक्ट के साथ उपयोगी कुछ भी करने के लिए (ऑब्जेक्ट द्वारा प्रदान की गई विधियों को कॉल करके), हमें एक कॉपी बनाना होगा!
आमतौर पर मेमोरीव्यू (या पुरानी बफर ऑब्जेक्ट) की आवश्यकता होगी जब हमारे पास एक बड़ी वस्तु होगी, और स्लाइस भी बड़ी हो सकती है। अगर हम बड़ी स्लाइस बना रहे हैं, या छोटी स्लाइस बना रहे हैं, लेकिन बड़ी संख्या में, तो बेहतर दक्षता की आवश्यकता मौजूद होगी।
उपरोक्त योजना के साथ, मैं यह नहीं देखता कि यह किसी भी स्थिति के लिए कैसे उपयोगी हो सकता है, जब तक कि कोई मुझे समझा नहीं सकता कि मैं यहां क्या याद कर रहा हूं।
Edit1:
हमारे पास डेटा का एक बड़ा हिस्सा है, हम इसे शुरू से अंत तक आगे बढ़ाकर संसाधित करना चाहते हैं, उदाहरण के लिए एक स्ट्रिंग बफर की शुरुआत से टोकन निकालने तक बफर का सेवन किया जाता है। सी टर्म में, यह एक पॉइंटर को आगे बढ़ा रहा है। बफर, और पॉइंटर को बफर प्रकार की अपेक्षा किसी भी फ़ंक्शन को पास किया जा सकता है। अजगर में ऐसा कुछ कैसे किया जा सकता है?
लोग वर्कअराउंड का सुझाव देते हैं, उदाहरण के लिए कई स्ट्रिंग और रेगेक्स फ़ंक्शन स्थिति तर्क देते हैं जिनका उपयोग पॉइंटर को आगे बढ़ाने के लिए किया जा सकता है। इसके साथ दो मुद्दे हैं: पहला यह एक काम के आसपास है, आपको कमियों को दूर करने के लिए अपनी कोडिंग शैली को बदलने के लिए मजबूर किया जाता है, और दूसरा: सभी कार्यों में स्थिति तर्क नहीं होते हैं, उदाहरण के लिए रेगेक्स फ़ंक्शन और startswith
करते हैं, encode()
/ decode()
नहीं।
अन्य लोग डेटा को चंक्स में लोड करने, या अधिकतम टोकन से छोटे खंडों में बफर को संसाधित करने का सुझाव दे सकते हैं। ठीक है, तो हम इन संभावित कार्यदलों से अवगत हैं, लेकिन हम भाषा को फिट करने के लिए कोडिंग शैली को मोड़ने की कोशिश किए बिना अजगर में अधिक स्वाभाविक तरीके से काम करने वाले हैं - क्या हम नहीं हैं?
EDIT2:
एक कोड नमूना चीजों को स्पष्ट कर देगा। यह वही है जो मैं करना चाहता हूं, और जो मैंने मेमोरीविले ग्रहण किया, वह मुझे पहली नज़र में करने की अनुमति देगा। मैं देख रहा हूँ कि कार्यक्षमता के लिए pmview (उचित स्मृति दृश्य) का उपयोग करें:
tokens = []
xlarge_str = get_string()
xlarge_str_view = pmview(xlarge_str)
while True:
token = get_token(xlarge_str_view)
if token:
xlarge_str_view = xlarge_str_view.vslice(len(token))
# vslice: view slice: default stop paramter at end of buffer
tokens.append(token)
else:
break