Перегляд пам'яті Python ()

Функція memoryview () повертає об'єкт перегляду пам'яті даного аргументу.

Перш ніж ми дізнаємося, що таке перегляди пам'яті, нам слід спочатку зрозуміти про буферний протокол Python.

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

Буферний протокол забезпечує спосіб доступу до внутрішніх даних об'єкта. Ці внутрішні дані є масивом пам'яті або буфером.

Буферний протокол дозволяє одному об'єкту виставляти свої внутрішні дані (буфери), а іншому доступ до цих буферів без проміжного копіювання.

Цей протокол доступний нам лише на рівні C-API і не використовується наша звичайна кодова база.

Отже, для того, щоб представити той самий протокол у звичайній кодовій базі Python, представлені перегляди пам'яті.

Що таке перегляд пам'яті?

Перегляд пам'яті - це безпечний спосіб розкрити буферний протокол у Python.

Це дозволяє отримати доступ до внутрішніх буферів об'єкта, створюючи об'єкт перегляду пам'яті.

Чому буферний протокол і подання пам'яті важливі?

Потрібно пам’ятати, що кожного разу, коли ми виконуємо якусь дію над об’єктом (викликаємо функцію об’єкта, нарізаємо масив), Python повинен створити копію об’єкта .

Якщо у нас є великі дані, з якими можна працювати (наприклад, двійкові дані зображення), ми без потреби створимо копії величезних шматків даних, які майже не приносять користі.

Використовуючи буферний протокол, ми можемо надати іншому об’єкту доступ для використання / модифікації великих даних, не копіюючи їх. Це змушує програму використовувати менше пам'яті та збільшує швидкість виконання.

Синтаксис пам'яті Python ()

Для викриття використання буферного протоколу memoryview()ми використовуємо такий синтаксис:

 memoryview (obj)

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

memoryview()Функція приймає один параметр:

  • obj - об'єкт, внутрішні дані якого мають бути відкриті. objповинен підтримувати протокол буфера (байти, байтовий масив)

Повернути значення з 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.

Цікаві статті...