English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Funzioni incorporate di Python
La funzione memoryview() restituisce un oggetto di vista della memoria per il parametro fornito.
Prima di comprendere cosa sia la vista della memoria, dobbiamo prima comprendere il protocollo di buffer di Python.
Il protocollo di buffer fornisce un metodo per accedere ai dati interni di un oggetto. Questi dati interni sono un array di memoria o un buffer.
Il protocollo di buffer permette a un oggetto di rendere pubblico i propri dati interni (buffer), e a un altro di accedere a questi buffer senza copie intermedie.
Possiamo accedere a questo protocollo solo al livello dell'API C, non possiamo utilizzare la nostra libreria di codice comune.
Pertanto, per rendere pubblico lo stesso protocollo alla libreria di codice Python comune, è necessario utilizzare la vista della memoria.
La vista della memoria è un metodo sicuro per rendere pubblico il protocollo di buffer in Python.
Permette di accedere al buffer interno dell'oggetto creando un oggetto di vista della memoria.
Dobbiamo ricordare che ogni volta che eseguiamo alcune operazioni su un oggetto (chiamare funzioni dell'oggetto, tagliare array) Python deve creareoggettodelCopia.
Se dobbiamo gestire grandi quantità di dati (ad esempio, dati binari di immagini), non è necessario creare copie inutili di grandi quantità di dati, che sono quasi inutili.
Utilizzando il protocollo di buffer, possiamo concedere a un altro oggetto l'accesso per utilizzare/modificare dati grandi senza dover copiarli. Questo permette al programma di utilizzare meno memoria e aumenta la velocità di esecuzione.
Per utilizzare il protocollo di buffer pubblico memoryview(), utilizziamo la seguente sintassi:
memoryview(obj)
La funzione memoryview() accetta un singolo parametro:
obj-Oggetto che deve rendere pubblico i propri dati interni. L'oggetto deve supportare il protocollo di buffer.bytes,bytearray)
La funzione memoryview() restituisce un oggetto vista della memoria.
#bytearray casuale random_byte_array = bytearray('ABC', 'utf-8') mv = memoryview(random_byte_array) # Accediamo all'indice zero della vista della memoria print(mv[0]) # Creiamo byte dalla vista della memoria print(bytes(mv[0:2])) # Creiamo una lista dalla vista della memoria print(list(mv[0:3]))
Risultato di output
65 b'AB' [65, 66, 67]
qui, partiamo dall'array di byterandom_byte_arrayabbiamo creato un oggetto vista della memoriamv.
Poi, accediamomvall'indice 0, 'A' e lo stampiamo (fornendo il valore ASCII -65).
Allo stesso modo, accediamo da 0 e 1mvall'indice 'AB', e lo convertiamo in byte.
Infine, abbiamo acceduto a tutti gli indici di mv e li abbiamo convertiti in una lista. Poiché l'array di byte interno memorizza i valori ASCII delle lettere, l'output è una lista dei valori ASCII di A, B e C.
# bytearray casuale random_byte_array = bytearray('ABC', 'utf-8') print('Prima dell'aggiornamento:', random_byte_array) mv = memoryview(random_byte_array) # Aggiorniamo il primo indice di mv a Z mv[1] = 90 print('Dopo l'aggiornamento:', random_byte_array)
Risultato di output
Prima dell'aggiornamento: bytearray(b'ABC') Dopo l'aggiornamento: bytearray(b'AZC')
qui, aggiorniamo il primo indice della vista della memoria a 90, ossia il valore ASCII Z.
poiché l'oggetto vista della memoriamvsi riferiscono allo stesso buffer/memoria, quindi viene aggiornatomv inl'indice verrà aggiornato ancherandom_byte_array.