Python bellek görünümü ()

Memoryview () işlevi, verilen bağımsız değişkenin bir bellek görünümü nesnesini döndürür.

Bellek görünümlerinin ne olduğuna girmeden önce, önce Python'un tampon protokolünü anlamamız gerekir.

Python Tampon Protokolü

Tampon protokolü, bir nesnenin dahili verilerine erişmenin bir yolunu sağlar. Bu dahili veriler bir bellek dizisi veya bir arabellektir.

Tampon protokolü, bir nesnenin dahili verilerini (tamponlar) açığa çıkarmasına ve diğerinin ara kopyalama olmadan bu tamponlara erişmesine izin verir.

Bu protokole sadece C-API seviyesinde erişebiliriz ve normal kod tabanımızı kullanmayız.

Dolayısıyla, aynı protokolü normal Python kod tabanına göstermek için bellek görünümleri mevcuttur.

Hafıza görünümü nedir?

Bellek görünümü, Python'da arabellek protokolünü açığa çıkarmanın güvenli bir yoludur.

Bir bellek görünümü nesnesi oluşturarak bir nesnenin dahili tamponlarına erişmenizi sağlar.

Arabellek protokolü ve bellek görünümleri neden önemlidir?

Bir nesne üzerinde bir eylem gerçekleştirdiğimizde (bir nesnenin bir işlevini çağırın, bir diziyi dilimleyin), Python'un nesnenin bir kopyasını oluşturması gerektiğini hatırlamamız gerekir .

Çalışacak büyük verilerimiz varsa (örneğin, bir görüntünün ikili verileri), gereksiz yere büyük veri yığınlarının kopyalarını yaratırız ve bu neredeyse hiçbir işe yaramaz.

Tampon protokolünü kullanarak, büyük veriyi kopyalamadan kullanmak / değiştirmek için başka bir nesneye erişim verebiliriz. Bu, programın daha az bellek kullanmasını sağlar ve yürütme hızını artırır.

Python memoryview () Sözdizimi

Tampon protokolünü kullanarak açığa çıkarmak için memoryview()bu sözdizimini kullanıyoruz:

 bellek görünümü (obj)

memoryview () Parametreler

memoryview()İşlev tek bir parametre alır:

  • obj - dahili verileri ifşa edilecek nesne. objarabellek protokolünü (bayt, baytearray) desteklemelidir

Bellek görünümünden () değer döndür

memoryview()Fonksiyon, bir bellek görünüşüdür nesnesini geri gönderir.

Örnek 1: memoryview () Python'da nasıl çalışır?

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

Çıktı

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

Burada, random_byte_array bayt dizisinden bir bellek görünümü nesnesi mv oluşturduk.

Sonra, mv'nin 0. indeksine eriştik 'A've bunu yazdırdık (ASCII değerini - 65 verir).

Yine, mv'nin indislerine 0 ve 1'den eriştik 'AB've bunları bayta dönüştürdük.

Son olarak, mv'nin tüm endekslerine eriştik ve bunu bir listeye dönüştürdük. bytearrayAlfabeler için ASCII değerini dahili olarak depoladığından, çıktı A, B ve C'nin ASCII değerlerinin bir listesidir.

Örnek 2: Dahili verileri bellek görünümünü kullanarak değiştirin

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

Çıktı

 Güncellemeden önce: bytearray (b'ABC ') Güncellemeden sonra: bytearray (b'AZC') 

Burada, bellek görünümünün 1. dizinini ASCII değeri olan 90 olarak güncelledik Z.

Bellek görüntüleme nesnesi mv aynı arabelleğe / belleğe başvurduğundan, dizinin mv'de güncellenmesi ayrıca random_byte_dizi de günceller.

Ilginç makaleler...