Python memoryview ()

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. objmå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 bytearraylagrar 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.

Intressanta artiklar...