Python memoryview()

La funzione memoryview() restituisce un oggetto memory view dell'argomento dato.

Prima di entrare nello specifico della funzione dobbiamo prima capire il protocollo buffer di Python.

Il protocollo buffer fornisce un modo per accedere ai dati interni di un oggetto. Questi dati interni sono un array di memoria o un buffer.

Il protocollo buffer permette ad un oggetto di esporre i suoi dati interni (buffer) e all'altro di accedere a questi buffer senza una copia intermedia.

Questo protocollo è accessibile a noi solo a livello C-API e non usando il nostro normale codice base.

Quindi, per esporre lo stesso protocollo al normale codice Python si utilizza memory view.

Cos'è una memory view e perché è importante?

Una memory view è un modo sicuro per esporre il protocollo buffer in Python. Essa permette di accedere ai buffer interni di un oggetto creando un oggetto memory view.

Ricorda che ogni volta che eseguiamo qualche azione su un oggetto (ad esempio chiamare una funzione di un oggetto), Python ha bisogno di creare una copia dell'oggetto.

Se abbiamo grandi dati con cui lavorare (ad esempio i dati binari di un'immagine), creeremmo inutilmente copie di enormi pezzi di dati, il che non serve quasi a nulla.

Utilizzando il protocollo buffer, possiamo dare ad un altro oggetto l'accesso, all'uso e modifica dei dati di grandi dimensioni senza copiarli. Questo fa sì che il programma utilizzi meno memoria e aumenti la velocità di esecuzione.

Per esporre il protocollo buffer usando memoryview(), usiamo questa sintassi:

memoryview(obj)

La funzione memoryview() prende un singolo parametro, l'oggetto i cui dati interni devono essere esposti. obj deve supportare il protocollo buffer (byte, bytearray).

La funzione memoryview() restituisce un oggetto memory view.

#random bytearray
random_byte_array = bytearray('ABC', 'utf-8')

mv = memoryview(random_byte_array)

# accesso all'indice a zero della memory view
print(mv[0])

# creo un byte da memory view
print(bytes(mv[0:2]))

# creo lista da memory view
print(list(mv[0:3]))

Output del codice

65
b'AB'
[65, 66, 67]