Python memoryview ()

Функцията memoryview () връща обект на изглед на паметта на дадения аргумент.

Преди да разберем какви са изгледите на паметта, първо трябва да разберем за буферния протокол на Python.

Протокол за буфер на Python

Буферният протокол осигурява начин за достъп до вътрешните данни на обект. Тези вътрешни данни са масив от памет или буфер.

Протоколът на буфера позволява на единия обект да изложи своите вътрешни данни (буфери), а другият да получи достъп до тези буфери без междинно копиране.

Този протокол е достъпен за нас само на ниво C-API и не използва нашата нормална кодова база.

Така че, за да се изложи един и същ протокол на нормалната кодова база на Python, присъстват изгледи на паметта.

Какво е изглед на паметта?

Изгледът на паметта е безопасен начин за излагане на буферния протокол в Python.

Позволява ви достъп до вътрешните буфери на обект чрез създаване на обект с изглед в паметта.

Защо буферните протоколи и изгледите на паметта са важни?

Трябва да помним, че когато изпълняваме някакво действие върху обект (извикваме функция на обект, нарязваме масив), Python трябва да създаде копие на обекта .

Ако имаме големи данни, с които да работим (напр. Двоични данни на изображение), ние ненужно бихме създали копия на огромни парчета данни, което почти не използва.

Използвайки буферния протокол, можем да дадем достъп на друг обект за използване / модифициране на големите данни, без да ги копираме. Това кара програмата да използва по-малко памет и увеличава скоростта на изпълнение.

Синтаксис на Python memoryview ()

За да изложим използвания буферен протокол memoryview(), използваме този синтаксис:

 memoryview (obj)

Параметри на memoryview ()

На memoryview()функцията се един параметър:

  • obj - обект, чиито вътрешни данни трябва да бъдат изложени. objтрябва да поддържа буферния протокол (байтове, bytearray)

Връщане на стойност от memoryview ()

Най memoryview()функцията връща оглед памет обект а.

Пример 1: Как работи memoryview () в Python?

 #random bytearray random_byte_array = bytearray('ABC', 'utf-8') mv = memoryview(random_byte_array) # access memory view's zeroth index print(mv(0)) # create byte from memory view print(bytes(mv(0:2))) # create list from memory view print(list(mv(0:3)))

Изход

 65 b'AB '(65, 66, 67) 

Тук създадохме обект за преглед на паметта mv от байтовия масив random_byte_array.

След това осъществихме достъп до 0-ия индекс на mv 'A'и го отпечатахме (което дава ASCII стойност - 65).

Отново получихме достъп до индексите на mv от 0 и 1 'AB'и ги преобразувахме в байтове.

Накрая получихме достъп до всички индекси на mv и го преобразувахме в списък. Тъй като вътрешно bytearrayсъхранява ASCII стойност за азбуките, изходът е списък със ASCII стойности на A, B и C.

Пример 2: Модифицирайте вътрешни данни, като използвате изглед на паметта

 # random bytearray random_byte_array = bytearray('ABC', 'utf-8') print('Before updation:', random_byte_array) mv = memoryview(random_byte_array) # update 1st index of mv to Z mv(1) = 90 print('After updation:', random_byte_array)

Изход

 Преди актуализация: bytearray (b'ABC ') След актуализация: bytearray (b'AZC') 

Тук актуализирахме първия индекс на изгледа на паметта до 90, стойността на ASCII на Z.

Тъй като обектът за преглед на паметта mv препраща към същия буфер / памет, актуализирането на индекса в mv също актуализира random_byte_array.

Интересни статии...