La función Python memoryview() devuelve los objetos de vistas de memoria. Antes de aprender más sobre la función memoryview(), veamos por qué usamos esta función.
¿Por qué usamos la función memoryview()?
Como la vista de memoria es una forma segura de exponer el protocolo de búfer en Python y una vista de memoria se comporta como bytes en muchos contextos útiles (por ejemplo, es compatible con el protocolo de mapeo), por lo que proporciona un reemplazo adecuado si se usa con cuidado. Lo mejor de esto es que utiliza el protocolo de búfer debajo de las cubiertas para evitar copias y simplemente hacer malabarismos con los punteros a los datos. Entonces, antes de entrar en las vistas de la memoria, primero debemos comprender el Protocolo de búfer.
Protocolo de búfer
El protocolo de búfer proporciona una forma de acceder a los datos internos de un objeto. Estos datos internos son una array de memoria o un búfer. Permite que un objeto exponga sus datos internos (búferes) y que el otro acceda a esos búferes sin realizar copias intermedias. El protocolo de búfer solo es accesible para nosotros en el nivel de C-API y no usamos nuestra base de código normal. Entonces, para exponer el mismo protocolo a un código base de Python normal, las vistas de memoria están presentes.
Vista de la memoria
Los objetos de vista de memoria permiten que el código de Python acceda a los datos internos de un objeto que admite el protocolo de búfer sin copiar. La función memoryview() permite el acceso directo de lectura y escritura a los datos orientados a bytes de un objeto sin necesidad de copiarlos primero. Eso puede generar grandes ganancias de rendimiento cuando se opera en objetos grandes, ya que no crea una copia al cortar.
Sintaxis: vista de memoria (obj)
Parámetros:
- obj: objeto cuyos datos internos se van a exponer.
- protocolo de búfer compatible: str y bytearray (pero no unicode).
Valor devuelto: Devuelve un objeto de vista de memoria.
Python memoryview() Ejemplo
Ejemplo 1: Python memoryview() funciona
Python3
byte_array = bytearray('XYZ', 'utf-8') mv = memoryview(byte_array) print(mv[0]) print(bytes(mv[0:1]))
Producción:
88 b'X
Ejemplo 2: Modificar datos internos usando memoryview
Python3
# Python program to illustrate # Modifying internal data using memory view # random bytearray byte_array = bytearray('XYZ', 'utf-8') print('Before update:', byte_array) mem_view = memoryview(byte_array) # update 2nd index of mem_view to J mem_view[2] = 74 print('After update:', byte_array)
Producción:
Before update: bytearray(b'XYZ') After update: bytearray(b'XYJ')
Explicación de cómo modificamos los datos internos en el programa anterior: aquí, actualizamos el segundo índice de la vista de memoria al valor ASCII como 74 (J). En este objeto de vista de memoria, mem_view hace referencia al mismo búfer o memoria y actualiza el índice en mem_view y también actualiza byte_array.
Ejemplo 3: Python memoryview() a bytes
Python3
# Python program to illustrate memory view # random bytearray byte_array = bytearray('XYZ', 'utf-8') mem_view = memoryview(byte_array) print(type(mem_view)) byt = bytes(mem_view) print(type(byt))
Producción:
<class 'memoryview'> <class 'bytes'>
Ejemplo 4: Python memoryview() a string
Python3
# Python program to illustrate memory view # random bytearray byte_array = bytearray('XYZ', 'utf-8') mem_view = memoryview(byte_array) print(type(mem_view)) string = str(mem_view) print(type(string))
Producción:
<class 'memoryview'> <class 'str'>
Importancia del protocolo de búfer y vistas de memoria
Al usar el protocolo de búfer, podemos trabajar con datos grandes como queremos trabajar con datos binarios de una imagen . Protocolo de búfer, puede crear otro acceso a objetos para modificar los datos grandes sin copiarlos. Esto hace que el programa use menos memoria y aumente la velocidad de ejecución.
Publicación traducida automáticamente
Artículo escrito por Shivani Ghughtyal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA