A memoryview () függvény az adott argumentum memória nézet objektumát adja vissza.
Mielőtt rátérnénk a memória nézetekre, először meg kell értenünk a Python pufferprotokollját.
Python puffer protokoll
A puffer protokoll lehetővé teszi az objektum belső adatainak elérését. Ez a belső adat memóriatömb vagy puffer.
A pufferprotokoll lehetővé teszi az egyik objektum számára, hogy kitegye a belső adatait (puffereit), a másik pedig hozzáférjen ezekhez a pufferekhez közbenső másolás nélkül.
Ez a protokoll csak a C-API szintjén érhető el számunkra, és nem a normál kódalapunkat használja.
Tehát annak érdekében, hogy ugyanazt a protokollt kitegyük a normál Python kódbázisra, memória nézetek vannak jelen.
Mi a memória nézet?
A memória nézet biztonságos módja a pufferprotokoll leleplezésének a Pythonban.
Ez lehetővé teszi az objektum belső puffereihez való hozzáférést memória nézet objektum létrehozásával.
Miért fontos a puffer protokoll és a memória nézetek?
Nem szabad megfeledkeznünk arról, hogy amikor valamilyen műveletet végrehajtunk egy objektummal (meghívunk egy objektum függvényét, szeletelünk egy tömböt), a Pythonnak létre kell hoznia az objektum másolatát .
Ha nagy adataink vannak (pl. Egy kép bináris adatai), akkor feleslegesen hoznánk létre hatalmas adatdarabok másolatait, amelyek szinte semmit sem használnak.
A pufferprotokoll használatával egy másik objektum számára hozzáférést adhatunk a nagy adatok felhasználásához / módosításához másolás nélkül. Ezáltal a program kevesebb memóriát használ fel, és növeli a végrehajtás sebességét.
Python memoryview () Szintaxis
A puffer protokoll memoryview()
használatával ezt a szintaxist használjuk:
memoryview (obj)
memoryview () Paraméterek
A memoryview()
függvény egyetlen paramétert vesz fel:
- obj - objektum, amelynek belső adatait ki akarják tüntetni.
obj
támogatnia kell a puffer protokollt (bájt, bytearray)
Visszatérési érték memórianézetből ()
A memoryview()
függvény egy memória nézet objektumot ad vissza.
1. példa: Hogyan működik a memoryview () a Pythonban?
#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)))
Kimenet
65 b'AB '(65, 66, 67)
Itt hoztunk létre egy memória nézet objektumot mv a random_byte_array bájt tömbből.
Ezután meglátogattuk az mv 0. indexét, 'A'
és kinyomtattuk (ez adja az ASCII értéket - 65).
Ismét elérhettük az mv indexeit 0-tól 1-ig 'AB'
, és átalakítottuk őket bájtokká.
Végül meglátogattuk az mv összes indexét és átalakítottuk listává. Mivel az bytearray
ASCII értéket belsőleg tárolja az ábécék számára, a kimenet az A, B és C ASCII-értékek listája.
2. példa: A belső adatok módosítása a memória nézet segítségével
# 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)
Kimenet
Frissítés előtt: bytearray (b'ABC ') Frissítés után: bytearray (b'AZC')
Itt frissítettük a memória nézet 1. indexét 90-re, az ASCII értékre Z
.
Mivel az mv memória nézet objektum ugyanarra a pufferre / memóriára hivatkozik, az mv index frissítése a random_byte_array fájlt is frissíti.