Vista de memoria de Python ()

La función memoryview () devuelve un objeto de vista de memoria del argumento dado.

Antes de entrar en lo que son las vistas de memoria, primero debemos comprender el protocolo de búfer de Python.

Protocolo de búfer de Python

El protocolo de búfer proporciona una forma de acceder a los datos internos de un objeto. Estos datos internos son una matriz de memoria o un búfer.

El protocolo de búfer permite que un objeto exponga sus datos internos (búferes) y que el otro acceda a esos búferes sin copia intermedia.

Este protocolo solo es accesible para nosotros en el nivel C-API y no usando nuestra base de código normal.

Entonces, para exponer el mismo protocolo al código base normal de Python, las vistas de memoria están presentes.

¿Qué es una vista de memoria?

Una vista de memoria es una forma segura de exponer el protocolo de búfer en Python.

Le permite acceder a los búferes internos de un objeto creando un objeto de vista de memoria.

¿Por qué son importantes las vistas de memoria y protocolo de búfer?

Debemos recordar que cada vez que realizamos alguna acción en un objeto (llamar a una función de un objeto, cortar una matriz), Python necesita crear una copia del objeto .

Si tenemos grandes datos con los que trabajar (por ejemplo, datos binarios de una imagen), crearíamos innecesariamente copias de grandes cantidades de datos, lo que casi no sirve de nada.

Usando el protocolo de búfer, podemos dar acceso a otro objeto para usar / modificar los datos grandes sin copiarlos. Esto hace que el programa utilice menos memoria y aumenta la velocidad de ejecución.

Sintaxis de Python memoryview ()

Para exponer el protocolo de búfer memoryview(), usamos esta sintaxis:

 memoryview (obj)

Parámetros de memoryview ()

La memoryview()función toma un solo parámetro:

  • obj : objeto cuyos datos internos se van a exponer. objdebe admitir el protocolo de búfer (bytes, bytearray)

Valor de retorno de memoryview ()

La memoryview()función devuelve un objeto de vista de memoria.

Ejemplo 1: ¿Cómo funciona memoryview () en 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)))

Salida

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

Aquí, creamos un objeto de vista de memoria mv a partir de la matriz de bytes random_byte_array.

Luego, accedimos al índice 0 del mv 'A', y lo imprimimos (lo que da el valor ASCII - 65).

Nuevamente, accedimos a los índices de mv desde 0 y 1 'AB', y los convertimos en bytes.

Finalmente, accedimos a todos los índices de mv y los convertimos en una lista. Dado que bytearrayalmacena internamente el valor ASCII para los alfabetos, la salida es una lista de valores ASCII de A, B y C.

Ejemplo 2: modificar datos internos usando la vista de memoria

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

Salida

 Antes de la actualización: bytearray (b'ABC ') Después de la actualización: bytearray (b'AZC') 

Aquí, actualizamos el primer índice de la vista de memoria a 90, el valor ASCII de Z.

Dado que el objeto de vista de memoria mv hace referencia al mismo búfer / memoria, la actualización del índice en mv también actualiza random_byte_array.

Articulos interesantes...