Python-muistinäkymä ()

Memoryview () -funktio palauttaa annetun argumentin muistinäkymäobjektin.

Ennen kuin pääsemme muistinäkymiin, meidän on ensin ymmärrettävä Pythonin puskuriprotokolla.

Python-puskuriprotokolla

Puskuriprotokolla tarjoaa tavan käyttää objektin sisäisiä tietoja. Tämä sisäinen data on muistiryhmä tai puskuri.

Puskuriprotokolla sallii yhden objektin paljastaa sisäisen datansa (puskurit) ja toisen käyttää näitä puskureita ilman välikopiointia.

Tämä protokolla on pääsy vain meille C-API-tasolla eikä käytä normaalia koodipohjamme.

Joten, jotta sama protokolla paljastettaisiin tavalliselle Python-koodikannalle, muistinäkymät ovat käytettävissä.

Mikä on muistinäkymä?

Muistinäkymä on turvallinen tapa paljastaa puskuriprotokolla Pythonissa.

Sen avulla voit käyttää objektin sisäisiä puskureita luomalla muistinäkymän objektin.

Miksi puskuriprotokolla ja muistinäkymät ovat tärkeitä?

Meidän on muistettava, että aina kun suoritamme objektille jonkin toiminnon (kutsumme objektin funktiota, leikkaa matriisi), Pythonin on luotava kopio objektista .

Jos meillä on käytössämme suuria tietoja (esim. Kuvan binaaritiedot), luisimme tarpeettomasti kopioita valtavista paloista, joista ei ole juuri mitään hyötyä.

Puskuriprotokollan avulla voimme antaa toiselle objektille pääsyn suurten tietojen käyttämiseen / muokkaamiseen kopioimatta niitä. Tämä tekee ohjelmasta vähemmän muistia ja lisää suoritusnopeutta.

Python memoryview () -syntaksi

Puskuriprotokollan paljastamiseksi memoryview()käyttämällä tätä syntaksia:

 memoryview (obj)

memoryview () -parametrit

memoryview()Toiminto ottaa yhden parametrin:

  • obj - esine, jonka sisäiset tiedot on tarkoitus paljastaa. objtäytyy tukea puskuriprotokollaa (tavua, tavua)

Palautusarvo muistinäkymästä ()

memoryview()Funktio palauttaa muistiin näkymä esine.

Esimerkki 1: Kuinka memoryview () toimii Pythonissa?

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

Tuotos

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

Tässä loimme muistinäkymän objektin mv tavujärjestyksestä random_byte_array.

Sitten pääsimme mv: n 0. indeksiin 'A'ja tulostimme sen (mikä antaa ASCII-arvon - 65).

Jälleen pääsimme mv: n indekseihin välillä 0 ja 1 'AB', ja muunnimme ne tavuiksi.

Lopuksi pääsimme kaikkiin mv: n indekseihin ja muunnimme sen luetteloksi. Koska bytearrayASCII-arvo tallennetaan sisäisesti aakkosille, lähtö on luettelo A: n, B: n ja C: n ASCII-arvoista.

Esimerkki 2: Sisäisten tietojen muokkaaminen muistinäkymällä

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

Tuotos

 Ennen päivitystä: bytearray (b'ABC ') Päivityksen jälkeen: bytearray (b'AZC') 

Tässä päivitimme muistinäkymän ensimmäisen indeksin arvoon 90, ASCII-arvoksi Z.

Koska muistinäkymäobjekti mv viittaa samaan puskuriin / muistiin, indeksin päivittäminen mv: ssä päivittää myös random_byte_array.

Mielenkiintoisia artikkeleita...