English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
تقوم دالة memoryview() بتحويل parameter المحدد إلى كيان عرض رؤية في الذاكرة.
قبل أن نفهم ما هو عرض الرؤية في الذاكرة، يجب أن نفهم أولاً بروتوكول التخزين المؤقت في بايثون.
يقدم بروتوكول التخزين المؤقت طريقة للوصول إلى البيانات الداخلية للكيان. هذه البيانات هي مصفوفة الذاكرة أو التخزين المؤقت.
بروتوكول التخزين المؤقت يسمح لكياناً بعرض بياناته الداخلية (الذاكرة) وأي كيان آخر يمكن الوصول إليها دون إعادة تكرار بينها.
نستطيع الوصول إلى هذا البروتوكول فقط على مستوى API الخاص بـ C، وليس باستخدام مكتبتنا العادية للكود.
لذلك، من أجل نشر نفس البروتوكول للكتبة العادية في بايثون، نحتاج إلى استخدام عرض الرؤية في الذاكرة.
عرض الرؤية في الذاكرة هو طريقة آمنة لعرض بروتوكول التخزين المؤقت في بايثون.
إنه يسمح لك بالوصول إلى الذاكرة الداخلية للكيان من خلال إنشاء كيان عرض رؤية في الذاكرة.
يجب أن نتذكر، في كل مرة نقوم بتنفيذ بعض العمليات على الكيان (إتصال الكيان بالدوال، قطع مصفوفة) تحتاج بايثون إلى إنشاءهذا الكيانمنالنسخ。
إذا كنا نتعامل مع بيانات كبيرة (مثل بيانات الصور الثنائية)، فإن إنشاء نسخ من البيانات الكبيرة غير ضروري ولا يفيد.
باستخدام بروتوكول التخزين المؤقت، يمكننا منح حق الوصول إلى كيان آخر لاستخدام/تعديل البيانات الكبيرة دون إعادة تكرارها. هذا يجعل البرنامج يستخدم ذاكرة أقل ويحسن سرعة التنفيذ.
للبحث عن بروتوكول التخزين المؤقت memoryview()، نستخدم الجملة التالية:
memoryview(obj)
يستخدم دالة memoryview() مع parameter واحد فقط:
obj-يُظهر الكيان الذي يحتوي على بياناته الداخلية. يجب أن يدعم obj بروتوكول التخزين المؤقت (bytes,bytearray)
memoryview()函数返回一个内存视图对象。
#随机bytearray random_byte_array = bytearray('ABC', 'utf-8') mv = memoryview(random_byte_array) # 访问内存视图的第零个索引 print(mv[0]) # 从内存视图创建字节 print(bytes(mv[0:2])) # 从内存视图创建列表 print(list(mv[0:3]))
输出结果
65 b'AB' [65, 66, 67]
在这里,我们从字节数组random_byte_array创建了一个内存视图对象mv。
然后,我们访问mv的第0个索引,'A'并将其打印(给出ASCII值-65)。
同样,我们从0和1 访问mv的索引'AB',并将其转换为字节。
最后,我们访问了mv的所有索引并将其转换为列表。 由于内部字节数组存储字母的ASCII值,因此输出为A,B和C的ASCII值列表。
# random bytearray random_byte_array = bytearray('ABC', 'utf-8') print('更新前:', random_byte_array) mv = memoryview(random_byte_array) # 将mv的第一个索引更新为Z mv[1] = 90 print('更新后:', random_byte_array)
输出结果
更新前: bytearray(b'ABC') 更新后: bytearray(b'AZC')
在这里,我们将内存视图的第一个索引更新为90,即ASCII值Z。
由于内存视图对象mv引用相同的缓冲区/内存,因此更新mv中的索引也会更新random_byte_array。