Python atmiņas skats ()

Funkcija memoryview () atgriež norādītā argumenta atmiņas skata objektu.

Pirms mēs ieskatāmies atmiņas skatījumos, mums vispirms ir jāsaprot par Python bufera protokolu.

Python bufera protokols

Buferprotokols nodrošina veidu, kā piekļūt objekta iekšējiem datiem. Šie iekšējie dati ir atmiņas masīvs vai buferis.

Bufera protokols ļauj vienam objektam atklāt savus iekšējos datus (buferus), bet otram piekļūt šiem buferiem bez starpkopēšanas.

Šis protokols mums ir pieejams tikai C-API līmenī un neizmanto mūsu parasto koda bāzi.

Tātad, lai pakļautu to pašu protokolu parastajai Python koda bāzei, ir pieejami atmiņas skati.

Kas ir atmiņas skats?

Atmiņas skats ir drošs veids, kā atklāt bufera protokolu Python.

Tas ļauj piekļūt objekta iekšējiem buferiem, izveidojot atmiņas skata objektu.

Kāpēc bufera protokols un atmiņas skati ir svarīgi?

Mums jāatceras, ka ikreiz, kad mēs veicam kādu darbību ar objektu (izsaucam objekta funkciju, sagriež masīvu), Python ir jāizveido objekta kopija .

Ja mūsu rīcībā ir lieli dati (piemēram, attēla binārie dati), mēs nevajadzīgi izveidotu milzīgu datu gabalu kopijas, kas gandrīz netiek izmantotas.

Izmantojot bufera protokolu, mēs varam piešķirt citam objektam piekļuvi lielu datu izmantošanai / modificēšanai, tos nekopējot. Tas liek programmai izmantot mazāk atmiņas un palielina izpildes ātrumu.

Python memoryview () sintakse

Lai parādītu bufera protokolu memoryview(), izmantojot šo sintaksi:

 memoryview (obj)

memoryview () parametri

memoryview()Funkcija ņem vienu parametru:

  • obj - objekts, kura iekšējie dati ir pakļauti. objjāatbalsta bufera protokols (baiti, baitu zīmējums)

Atgriezeniskā vērtība no atmiņas skata ()

memoryview()Funkcija atgriež atmiņas skats objektu.

1. piemērs: Kā atmiņas skats () darbojas 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)))

Rezultāts

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

Šeit mēs izveidojām atmiņas skata objektu mv no baitu masīva random_byte_array.

Pēc tam mēs piekļuvām mv 0. indeksam 'A'un to izdrukājām (kas dod ASCII vērtību - 65).

Atkal mēs piekļuvām mv indeksiem no 0 un 1 'AB', un pārveidojām tos baitos.

Visbeidzot, mēs piekļuvām visiem mv indeksiem un pārveidojām to sarakstā. Tā kā iekšēji tiek bytearrayglabāta alfabētu ASCII vērtība, izeja ir A, B un C ASCII vērtību saraksts.

2. piemērs: modificējiet iekšējos datus, izmantojot atmiņas skatu

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

Rezultāts

 Pirms atjaunināšanas: bytearray (b'ABC ') Pēc atjaunināšanas: bytearray (b'AZC') 

Šeit mēs atjauninājām atmiņas skata 1. indeksu līdz 90, ASCII vērtību Z.

Tā kā atmiņas skata objekts mv atsaucas uz to pašu buferi / atmiņu, atjauninot mv indeksu, tiek atjaunināts arī random_byte_array.

Interesanti raksti...