মেমোরিভিউতে ডকুমেন্টেশন চেক করা হচ্ছে:
মেমোরিভিউ অবজেক্টগুলি পাইথন কোডটিকে এমন কোনও সামগ্রীর অভ্যন্তরীণ ডেটা অ্যাক্সেস করার অনুমতি দেয় যা অনুলিপি ছাড়াই বাফার প্রোটোকল সমর্থন করে।
বর্গ স্মৃতিদর্শন ( আপত্তি )
একটি মেমরির ভিউ তৈরি করুন যা আপত্তিটিকে রেফারেন্স করে। আপত্তি অবশ্যই বাফার প্রোটোকল সমর্থন করবে। বাফার প্রোটোকল সমর্থন করে অন্তর্নির্মিত অবজেক্টগুলির মধ্যে বাইটস এবং বাইটারি অন্তর্ভুক্ত।
তারপরে আমাদের নমুনা কোড দেওয়া হবে:
>>> 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
>>>
সুতরাং আমি উপরে থেকে কি সংগ্রহ:
অনুলিপি ছাড়াই বাফার অবজেক্টের অভ্যন্তরীণ তথ্য প্রকাশের জন্য আমরা একটি মেমরিভিউ অবজেক্ট তৈরি করি, তবে, বস্তুর সাথে দরকারী কোনও কিছু করার জন্য (বস্তুর সরবরাহিত পদ্ধতিগুলিতে কল করে), আমাদের একটি অনুলিপি তৈরি করতে হবে!
সাধারণত আমাদের যখন একটি বড় অবজেক্ট থাকে তখন মেমোরিভিউ (বা পুরাতন বাফার অবজেক্ট) প্রয়োজন হবে এবং স্লাইসগুলিও বড় হতে পারে। যদি আমরা বড় টুকরোগুলি তৈরি করি, বা ছোট ছোট টুকরোগুলি তৈরি করি তবে বহু সংখ্যকবার আরও কার্যকর দক্ষতার প্রয়োজন উপস্থিত হয়।
উপরোক্ত স্কিমটি সহ, আমি দেখতে পাচ্ছি না যে এটি উভয় পরিস্থিতিতে কীভাবে কার্যকর হতে পারে, যদি না কেউ আমাকে এখানে কী মিস করছি তা আমাকে ব্যাখ্যা না করে।
সম্পাদনা 1:
আমাদের কাছে প্রচুর ডেটা রয়েছে, আমরা প্রারম্ভ থেকে শেষ পর্যন্ত অগ্রসর হয়ে এটি প্রক্রিয়া করতে চাই, উদাহরণস্বরূপ স্ট্রিং বাফার শুরু থেকে টফেনগুলি বের করে বাফারটি গ্রাস না করা পর্যন্ত। সি টার্মে এটি একটি পয়েন্টারকে অগ্রসর করছে বাফার, এবং পয়েন্টারটি বাফারের ধরণের প্রত্যাশায় যে কোনও ফাংশনে যেতে পারে। অজগরে কীভাবে অনুরূপ কিছু করা যায়?
লোকেদের কাজের প্রস্তাব দেয়, উদাহরণস্বরূপ অনেকগুলি স্ট্রিং এবং রেজেক্স ফাংশন অবস্থান যুক্তি গ্রহণ করে যা পয়েন্টারকে অগ্রসর করার জন্য ব্যবহার করা যেতে পারে। এটির সাথে দুটি সমস্যা রয়েছে: প্রথমত এটি একটি কাজ, ত্রুটিগুলি কাটিয়ে ওঠার জন্য আপনাকে আপনার কোডিং স্টাইলটি পরিবর্তন করতে বাধ্য করা হবে এবং দ্বিতীয়: সমস্ত ফাংশনগুলির অবস্থানের আর্গুমেন্ট নেই, উদাহরণস্বরূপ রেজেক্স ফাংশন এবং startswith
করবেন, encode()
/ decode()
করবেন না।
অন্যেরা অংশটিকে ডেটা লোড করার পরামর্শ দিতে পারে, বা সর্বোচ্চ টোকেনের চেয়ে বড় অংশে বাফার প্রসেস করতে পারে। ঠিক আছে তাই আমরা এই সম্ভাব্য কর্মক্ষেত্র সম্পর্কে সচেতন, তবে ভাষাটি ফিট করার জন্য কোডিং স্টাইলটি বাঁকানোর চেষ্টা না করে আমাদের অজগরে আরও প্রাকৃতিক উপায়ে কাজ করার কথা - আমরা কি তাই না?
সম্পাদনা 2:
একটি কোড নমুনা জিনিস পরিষ্কার করতে হবে। এটিই আমি করতে চাই এবং আমি যা মনে করেছি স্মৃতিদর্শনটি আমাকে প্রথম নজরে করার অনুমতি দেয়। আমি যে কার্যকারিতাটি সন্ধান করছি তার জন্য পিএমভিউ (সঠিক মেমরি ভিউ) ব্যবহার করতে দিন:
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