Volver a la página principal
miércoles 25 septiembre 2024
43

Cómo usar memoryview() en Python para manejar datos de manera eficiente

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.

¿Cómo funciona memoryview() en Python?

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.

Ejemplo de uso básico:

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

Ventajas de usar memoryview()

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.

Modificar datos en objetos mutables:

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

Uso avanzado de memoryview()

Slicing (corte) con memoryview:

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'

Convertir la vista en bytes u otros formatos:

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'

Ejemplos adicionales

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)

Referencia oficial

Puedes consultar más sobre memoryview() en la documentación oficial de Python.

Etiquetas:
python
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer