Python memoryview ()

Memoryview () -funksjonen returnerer et minnevisningsobjekt for det gitte argumentet.

Før vi går inn på hva minnevisninger er, må vi først forstå Pythons bufferprotokoll.

Python Buffer Protocol

Bufferprotokollen gir en måte å få tilgang til de interne dataene til et objekt. Disse interne dataene er et minnesystem eller en buffer.

Bufferprotokollen tillater det ene objektet å eksponere sine interne data (buffere) og det andre få tilgang til disse bufferne uten mellomkopiering.

Denne protokollen er bare tilgjengelig for oss på C-API-nivå og bruker ikke vår vanlige kodebase.

Så, for å eksponere den samme protokollen for den normale Python-kodebasen, er minnevisninger til stede.

Hva er en minnesyn?

En minnevisning er en trygg måte å avsløre bufferprotokollen i Python.

Det gir deg tilgang til de interne bufferne til et objekt ved å opprette et minnevisningsobjekt.

Hvorfor bufferprotokoll og minnevisninger er viktig?

Vi må huske at når vi utfører noen handlinger på et objekt (kaller en funksjon av et objekt, kutter en matrise), må Python lage en kopi av objektet .

Hvis vi har store data å jobbe med (f.eks. Binære data i et bilde), ville vi unødvendig lage kopier av store deler av data, som nesten ikke tjener noe.

Ved hjelp av bufferprotokollen kan vi gi et annet objekt tilgang til å bruke / endre store data uten å kopiere dem. Dette gjør at programmet bruker mindre minne og øker kjøringshastigheten.

Python memoryview () Syntaks

For å avsløre bufferprotokollen ved memoryview()hjelp av denne syntaksen:

 memoryview (obj)

memoryview () Parametere

Den memoryview()funksjonen tar en enkelt parameter:

  • obj - objekt hvis indre data skal bli eksponert. objmå støtte bufferprotokollen (byte, bytearray)

Returverdi fra minnevisning ()

Den memoryview()funksjonen returnerer et minne syn objekt.

Eksempel 1: Hvordan memoryview () fungerer i 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)))

Produksjon

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

Her opprettet vi et minnevisningsobjekt mv fra byte-arrayet random_byte_array.

Deretter fikk vi tilgang til mv's 0th index 'A', og skrev den ut (som gir ASCII-verdien - 65).

Igjen fikk vi tilgang til mv's indekser fra 0 og 1 'AB', og konverterte dem til byte.

Til slutt fikk vi tilgang til alle indeksene til mv og konverterte den til en liste. Siden internt bytearraylagrer ASCII-verdi for alfabetene, er utdataene en liste over ASCII-verdier for A, B og C.

Eksempel 2: Endre interne data ved hjelp av minnevisning

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

Produksjon

 Før oppdatering: bytearray (b'ABC ') Etter oppdatering: bytearray (b'AZC') 

Her oppdaterte vi minnevisningens første indeks til 90, ASCII-verdien på Z.

Siden minnevisningsobjektet mv refererer til samme buffer / minne, oppdaterer indeksen i mv også random_byte_array.

Interessante artikler...