Memoryview () -funktionen returnerar ett minnesvyobjekt för det givna argumentet.
Innan vi går in i vad minnesvyer är måste vi först förstå Pythons buffertprotokoll.
Python Buffer Protocol
Buffertprotokollet ger ett sätt att få åtkomst till ett internt data. Denna interna data är en minnesmatris eller en buffert.
Buffertprotokollet tillåter att ett objekt exponerar sina interna data (buffertar) och det andra kan komma åt dessa buffertar utan mellanliggande kopiering.
Detta protokoll är endast tillgängligt för oss på C-API-nivå och använder inte vår normala kodbas.
Så, för att exponera samma protokoll för den normala Python-kodbasen, finns minnesvyer.
Vad är en minnesvy?
En minnesvy är ett säkert sätt att exponera buffertprotokollet i Python.
Det låter dig komma åt de interna buffertarna i ett objekt genom att skapa ett minnesvyobjekt.
Varför är buffertprotokoll och minnesvyer viktiga?
Vi måste komma ihåg att när vi utför en åtgärd på ett objekt (kallar en funktion för ett objekt, skär en array), måste Python skapa en kopia av objektet .
Om vi har stora data att arbeta med (t.ex. binära data i en bild) skulle vi i onödan skapa kopior av enorma bitar av data, som nästan inte tjänar något.
Med hjälp av buffertprotokollet kan vi ge ett annat objekt åtkomst för att använda / modifiera stora data utan att kopiera det. Detta gör att programmet använder mindre minne och ökar körhastigheten.
Python memoryview () Syntax
För att exponera buffertprotokollet med använder memoryview()
vi denna syntax:
memoryview (obj)
memoryview () Parametrar
Den memoryview()
funktionen tar en enda parameter:
- objekt - objekt vars interna data ska exponeras.
obj
måste stödja buffertprotokollet (byte, bytearray)
Returvärde från minnesvy ()
Den memoryview()
returnerar en minnesöversiktsobjekt.
Exempel 1: Hur fungerar memoryview () 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)))
Produktion
65 b'AB '(65, 66, 67)
Här skapade vi ett minnesvyobjekt mv från byte array random_byte_array.
Sedan öppnade vi mv: s 0: e index, 'A'
och skrev ut det (vilket ger ASCII-värdet - 65).
Återigen kom vi till mv: s index från 0 och 1 'AB'
och konverterade dem till byte.
Slutligen fick vi tillgång till alla index för mv och konverterade den till en lista. Eftersom internt bytearray
lagrar ASCII-värde för alfabeten, är utdata en lista över ASCII-värden på A, B och C.
Exempel 2: Ändra intern data med hjälp av minnesvy
# 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)
Produktion
Före uppdatering: bytearray (b'ABC ') Efter uppdatering: bytearray (b'AZC')
Här uppdaterade vi minnesvyens första index till 90, ASCII-värdet på Z
.
Eftersom minnesvyobjektet mv refererar till samma buffert / minne, uppdateras indexet i mv också random_byte_array.