Python memoryview ()

Funkcja memoryview () zwraca obiekt widoku pamięci dla podanego argumentu.

Zanim przejdziemy do tego, czym są widoki pamięci, musimy najpierw zrozumieć protokół bufora Pythona.

Protokół bufora Pythona

Protokół bufora umożliwia dostęp do wewnętrznych danych obiektu. Te dane wewnętrzne to tablica pamięci lub bufor.

Protokół bufora umożliwia jednemu obiektowi ujawnienie swoich danych wewnętrznych (buforów), a drugiemu dostęp do tych buforów bez pośredniego kopiowania.

Ten protokół jest dostępny tylko dla nas na poziomie C-API i nie używa naszej normalnej bazy kodu.

Tak więc, aby udostępnić ten sam protokół normalnej bazie kodu Pythona, dostępne są widoki pamięci.

Co to jest widok pamięci?

Widok pamięci to bezpieczny sposób ujawnienia protokołu bufora w Pythonie.

Umożliwia dostęp do wewnętrznych buforów obiektu poprzez utworzenie obiektu widoku pamięci.

Dlaczego protokół bufora i widoki pamięci są ważne?

Musimy pamiętać, że za każdym razem, gdy wykonujemy jakąś akcję na obiekcie (wywołujemy funkcję obiektu, wycinamy tablicę), Python musi utworzyć kopię obiektu .

Gdybyśmy mieli duże dane do pracy (np. Dane binarne obrazu), niepotrzebnie tworzylibyśmy kopie ogromnych porcji danych, które prawie nie służą.

Korzystając z protokołu bufora, możemy dać innemu obiektowi dostęp do używania / modyfikowania dużych danych bez ich kopiowania. To sprawia, że ​​program zużywa mniej pamięci i zwiększa szybkość wykonywania.

Składnia memoryview () w języku Python

Aby udostępnić protokół bufora za pomocą memoryview(), używamy następującej składni:

 memoryview (obj)

memoryview () Parametry

memoryview()Funkcja przyjmuje jeden parametr:

  • obj - obiekt, którego wewnętrzne dane mają zostać ujawnione. objmusi obsługiwać protokół bufora (bajty, bytearray)

Wartość zwracana z memoryview ()

memoryview()Funkcja zwraca obiekt widoku pamięci.

Przykład 1: Jak działa memoryview () w Pythonie?

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

Wynik

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

Tutaj utworzyliśmy obiekt widoku pamięci mv z tablicy bajtów random_byte_array.

Następnie uzyskaliśmy dostęp do zerowego indeksu mv 'A'i wydrukowaliśmy go (co daje wartość ASCII - 65).

Ponownie uzyskaliśmy dostęp do indeksów mv od 0 do 1 'AB'i przekonwertowaliśmy je na bajty.

Wreszcie uzyskaliśmy dostęp do wszystkich indeksów mv i przekonwertowaliśmy je na listę. Ponieważ wewnętrznie bytearrayprzechowuje wartości ASCII dla alfabetów, wynikiem jest lista wartości ASCII A, B i C.

Przykład 2: Modyfikacja danych wewnętrznych za pomocą widoku pamięci

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

Wynik

 Przed aktualizacją: bytearray (b'ABC ') Po aktualizacji: bytearray (b'AZC') 

Tutaj zaktualizowaliśmy pierwszy indeks widoku pamięci do 90, czyli wartość ASCII Z.

Ponieważ obiekt widoku pamięci mv odwołuje się do tego samego bufora / pamięci, aktualizacja indeksu w mv również aktualizuje tablicę random_byte_array.

Interesujące artykuły...