Funkcija „memoryview“ () pateikia nurodyto argumento atminties peržiūros objektą.
Prieš įsigilindami į atminties rodinius, pirmiausia turime suprasti apie „Python“ buferio protokolą.
„Python“ buferio protokolas
Buferio protokolas suteikia galimybę pasiekti vidinius objekto duomenis. Šie vidiniai duomenys yra atminties masyvas arba buferis.
Buferio protokolas leidžia vienam objektui atskleisti savo vidinius duomenis (buferius), o kitam prieiti prie tų buferių be tarpinio kopijavimo.
Šis protokolas mums prieinamas tik C-API lygiu ir nenaudoja įprasto kodo pagrindo.
Taigi, norint atskleisti tą patį protokolą įprastai „Python“ kodų bazei, yra atminties rodiniai.
Kas yra atminties vaizdas?
Atminties rodinys yra saugus būdas parodyti buferio protokolą „Python“.
Tai leidžia jums pasiekti objekto vidinius buferius, sukurdami atminties rodinio objektą.
Kodėl buferinis protokolas ir atminties rodiniai yra svarbūs?
Turime prisiminti, kad kai tik atliekame kokį nors veiksmą objekte (iškviečiame objekto funkciją, supjaustome masyvą), „Python“ turi sukurti objekto kopiją .
Jei turime didelių duomenų (pvz., Dvejetainius vaizdo duomenis), mes be reikalo sukurtume didžiulių duomenų dalių kopijas, kurios beveik nenaudojamos.
Naudodami buferio protokolą galime suteikti kitam objektui prieigą naudoti / modifikuoti didelius duomenis jų nekopijuodami. Dėl to programa naudoja mažiau atminties ir padidina vykdymo greitį.
„Python memoryview“ () sintaksė
Norėdami atskleisti buferio protokolą naudodami memoryview()
šią sintaksę:
memoryview (obj)
„memoryview“ () parametrai
memoryview()
Funkcija priima vieną parametrą:
- obj - objektas, kurio vidiniai duomenys turi būti atskleisti.
obj
turi palaikyti buferio protokolą (baitai, baitai)
Grąžinimo vertė iš atmintinės peržiūros ()
memoryview()
Funkcija grąžina atminties vaizdas objektą.
1 pavyzdys: Kaip „memoryview“ () veikia „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)))
Rezultatas
65 b'AB '(65, 66, 67)
Čia mes sukūrėme atminties rodinio objektą mv iš baitų masyvo random_byte_array.
Tada mes pasiekėme 0-ąjį mv indeksą 'A'
ir jį atspausdinome (o tai suteikia ASCII reikšmę - 65).
Vėlgi, mes pasiekėme mv indeksus nuo 0 ir 1 'AB'
, ir pavertėme juos baitais.
Galiausiai mes priėjome visus mv indeksus ir pavertėme jį sąrašu. Kadangi viduje bytearray
saugoma abėcėlių ASCII reikšmė, išvestis yra A, B ir C ASCII reikšmių sąrašas.
2 pavyzdys: vidinių duomenų modifikavimas naudojant atminties rodinį
# 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)
Rezultatas
Prieš atnaujinimą: bytearray (b'ABC ') Po atnaujinimo: bytearray (b'AZC')
Čia mes atnaujinome atminties rodinio 1 rodyklę iki 90, ASCII reikšmę Z
.
Kadangi atminties rodinio objektas „mv“ nurodo tą patį buferį / atmintį, atnaujinus „mv“ indeksą, taip pat atnaujinamas „random_byte_array“.