Python memoryview ()

La funzione memoryview () restituisce un oggetto di visualizzazione della memoria dell'argomento specificato.

Prima di entrare in cosa sono le viste di memoria, dobbiamo prima capire il protocollo del buffer di Python.

Protocollo Python Buffer

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 consente a un oggetto di esporre i propri dati interni (buffer) e all'altro di accedere a tali buffer senza copiatura intermedia.

Questo protocollo è accessibile solo a livello C-API e non utilizzando la nostra normale base di codice.

Quindi, per esporre lo stesso protocollo alla normale base di codice Python, sono presenti viste di memoria.

Cos'è una visualizzazione della memoria?

Una visualizzazione della memoria è un modo sicuro per esporre il protocollo del buffer in Python.

Consente di accedere ai buffer interni di un oggetto creando un oggetto di visualizzazione della memoria.

Perché il protocollo del buffer e le visualizzazioni della memoria sono importanti?

Dobbiamo ricordare che ogni volta che eseguiamo un'azione su un oggetto (chiamiamo una funzione di un oggetto, suddividiamo un array), Python deve creare una copia dell'oggetto .

Se abbiamo dati di grandi dimensioni con cui lavorare (ad es. Dati binari di un'immagine), creeremmo inutilmente copie di enormi blocchi di dati, che non servono quasi a nulla.

Utilizzando il protocollo buffer, possiamo dare a un altro oggetto l'accesso per usare / modificare i dati di grandi dimensioni senza copiarli. In questo modo il programma utilizza meno memoria e aumenta la velocità di esecuzione.

Sintassi di Python memoryview ()

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

 memoryview (obj)

Parametri memoryview ()

La memoryview()funzione accetta un singolo parametro:

  • obj - oggetto i cui dati interni devono essere esposti. objdeve supportare il protocollo buffer (byte, bytearray)

Valore restituito da memoryview ()

La memoryview()funzione restituisce un oggetto di visualizzazione della memoria.

Esempio 1: come funziona memoryview () in 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)))

Produzione

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

Qui, abbiamo creato un oggetto di visualizzazione della memoria mv dall'array di byte random_byte_array.

Quindi, abbiamo effettuato l'accesso all'indice 0 ° di mv 'A'e lo abbiamo stampato (che fornisce il valore ASCII - 65).

Di nuovo, abbiamo eseguito l'accesso agli indici di mv da 0 e 1 'AB'e li abbiamo convertiti in byte.

Infine, abbiamo avuto accesso a tutti gli indici di mv e l'abbiamo convertito in una lista. Poiché internamente bytearraymemorizza il valore ASCII per gli alfabeti, l'output è un elenco di valori ASCII di A, B e C.

Esempio 2: modificare i dati interni utilizzando la visualizzazione della 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)

Produzione

 Prima dell'aggiornamento: bytearray (b'ABC ') Dopo l'aggiornamento: bytearray (b'AZC') 

Qui, abbiamo aggiornato il primo indice della vista della memoria a 90, il valore ASCII di Z.

Poiché l'oggetto di visualizzazione della memoria mv fa riferimento allo stesso buffer / memoria, l'aggiornamento dell'indice in mv aggiorna anche random_byte_array.

Articoli interessanti...