Просмотр памяти Python ()

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

Прежде чем мы перейдем к тому, что такое представления памяти, нам нужно сначала понять буферный протокол Python.

Буферный протокол Python

Протокол буфера предоставляет способ доступа к внутренним данным объекта. Эти внутренние данные представляют собой массив памяти или буфер.

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

Этот протокол доступен нам только на уровне C-API и не использует нашу обычную кодовую базу.

Итак, чтобы предоставить тот же протокол обычной кодовой базе Python, присутствуют представления памяти.

Что такое просмотр памяти?

Представление памяти - это безопасный способ раскрыть протокол буфера в Python.

Это позволяет вам получить доступ к внутренним буферам объекта, создав объект представления памяти.

Почему важны протокол буфера и представления памяти?

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

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

Используя протокол буфера, мы можем предоставить другому объекту доступ для использования / изменения больших данных без их копирования. Это заставляет программу использовать меньше памяти и увеличивает скорость выполнения.

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

Чтобы раскрыть использование протокола буфера memoryview(), мы используем этот синтаксис:

 memoryview (объект)

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') 

Здесь мы обновили 1-й индекс представления памяти до 90, значение ASCII - Z.

Поскольку объект представления памяти mv ссылается на тот же буфер / память, обновление индекса в mv также обновляет random_byte_array.

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