„Python“ atmintinė ()

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. objturi 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 bytearraysaugoma 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“.

Įdomios straipsniai...