La función memoryview()
en Python permite acceder a los datos subyacentes de un objeto sin hacer una copia. Esto es útil para manejar grandes volúmenes de datos (como arrays o bytes) de manera más eficiente, ya que permite trabajar directamente con la memoria en lugar de duplicar los datos.
memoryview()
crea un "visor" de un objeto que soporta el protocolo de búfer, como bytes, bytearray o arrays. A través de este visor, puedes acceder y modificar los datos de forma directa, sin la sobrecarga de copiar el contenido.
# Crear un objeto de tipo bytes
datos = b'Hola Mundo'
# Crear un memoryview de los datos
visor = memoryview(datos)
# Acceder a la vista como si fuera un array de bytes
print(visor[0]) # Devuelve 72, que es el valor ASCII de 'H'
1. Eficiencia en memoria: No se realiza una copia de los datos, lo que permite trabajar con grandes conjuntos de datos sin duplicarlos.
2. Modificación de datos mutable: Si el objeto es mutable (como bytearray
), puedes modificar los datos a través del visor.
# Usar bytearray en lugar de bytes para modificar el contenido
datos = bytearray(b'Hola Mundo')
visor = memoryview(datos)
# Cambiar el primer byte (H -> J)
visor[0] = 74 # Valor ASCII de 'J'
print(datos) # Devuelve bytearray(b'Jola Mundo')
En este ejemplo, modificamos los datos directamente en la memoria sin crear una copia del objeto.
Puedes hacer slicing de un memoryview
igual que con listas o arrays.
datos = b'Python'
visor = memoryview(datos)
# Acceder a una porción de los datos
print(visor[1:4].tobytes()) # Devuelve b'yth'
Puedes convertir un memoryview
de vuelta a otros formatos como bytes
o list
si lo necesitas.
datos = b'12345'
visor = memoryview(datos)
# Convertir la vista a una lista de enteros
print(list(visor)) # [49, 50, 51, 52, 53] (valores ASCII)
# Convertir la vista a bytes
print(visor.tobytes()) # b'12345'
1. Manipular un gran array de bytes sin copiar datos:
import array
# Crear un array grande de enteros
arr = array.array('i', range(10))
# Crear un memoryview del array
visor = memoryview(arr)
# Modificar directamente los primeros elementos
visor[0] = 100
print(arr) # array('i', [100, 1, 2, 3, 4, 5, 6, 7, 8, 9])
2. Acceder a diferentes formatos de datos:
arr = bytearray(b'\x00\x01\x00\x00')
visor = memoryview(arr)
# Interpretar los primeros dos bytes como un entero de 16 bits
print(visor.cast('H')[0]) # 256 (0x0100 en hexadecimal)
Puedes consultar más sobre memoryview()
en la documentación oficial de Python.
Jorge García
Fullstack developer