Python memoryview ()

Die Funktion memoryview () gibt ein Speicheransichtsobjekt des angegebenen Arguments zurück.

Bevor wir uns mit den Speicheransichten befassen, müssen wir zunächst das Pufferprotokoll von Python verstehen.

Python-Pufferprotokoll

Das Pufferprotokoll bietet eine Möglichkeit, auf die internen Daten eines Objekts zuzugreifen. Diese internen Daten sind ein Speicherarray oder ein Puffer.

Das Pufferprotokoll ermöglicht es einem Objekt, seine internen Daten (Puffer) verfügbar zu machen, und dem anderen, auf diese Puffer zuzugreifen, ohne zwischenzeitlich zu kopieren.

Dieses Protokoll ist nur auf C-API-Ebene für uns zugänglich und verwendet nicht unsere normale Codebasis.

Um dasselbe Protokoll der normalen Python-Codebasis zugänglich zu machen, sind Speicheransichten vorhanden.

Was ist eine Speicheransicht?

Eine Speicheransicht ist eine sichere Möglichkeit, das Pufferprotokoll in Python verfügbar zu machen.

Sie können auf die internen Puffer eines Objekts zugreifen, indem Sie ein Speicheransichtsobjekt erstellen.

Warum sind Pufferprotokoll- und Speicheransichten wichtig?

Wir müssen uns daran erinnern, dass Python immer dann eine Kopie des Objekts erstellen muss, wenn wir eine Aktion für ein Objekt ausführen (eine Funktion eines Objekts aufrufen, ein Array in Scheiben schneiden) .

Wenn wir mit großen Datenmengen arbeiten müssen (z. B. Binärdaten eines Bildes), würden wir unnötigerweise Kopien großer Datenmengen erstellen, was fast keinen Nutzen bringt.

Mit dem Pufferprotokoll können wir einem anderen Objekt Zugriff gewähren, um die großen Datenmengen zu verwenden / zu ändern, ohne sie zu kopieren. Dadurch verbraucht das Programm weniger Speicher und erhöht die Ausführungsgeschwindigkeit.

Python memoryview () Syntax

Um das Pufferprotokoll mit verfügbar zu machen memoryview(), verwenden wir diese Syntax:

 Speicheransicht (obj)

memoryview () Parameter

Die memoryview()Funktion akzeptiert einen einzelnen Parameter:

  • obj - Objekt, dessen interne Daten verfügbar gemacht werden sollen. objmuss das Pufferprotokoll unterstützen (Bytes, Bytearray)

Rückgabewert aus memoryview ()

Die memoryview()Funktion gibt ein Speicheransichtsobjekt zurück.

Beispiel 1: Wie funktioniert memoryview () in 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)))

Ausgabe

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

Hier haben wir ein Speicheransichtsobjekt mv aus dem Bytearray random_byte_array erstellt.

Dann haben wir auf den 0. Index des mv zugegriffen 'A'und ihn gedruckt (was den ASCII-Wert - 65 ergibt).

Wieder haben wir von 0 und 1 auf die mv-Indizes zugegriffen 'AB'und sie in Bytes konvertiert.

Schließlich haben wir auf alle Indizes von mv zugegriffen und sie in eine Liste konvertiert. Da der bytearrayASCII-Wert für die Alphabete intern gespeichert wird, ist die Ausgabe eine Liste der ASCII-Werte von A, B und C.

Beispiel 2: Ändern Sie interne Daten mithilfe der Speicheransicht

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

Ausgabe

 Vor der Aktualisierung: bytearray (b'ABC ') Nach der Aktualisierung: bytearray (b'AZC') 

Hier haben wir den 1. Index der Speicheransicht auf 90 aktualisiert, den ASCII-Wert von Z.

Da das Speicheransichtsobjekt mv auf denselben Puffer / Speicher verweist, aktualisiert das Aktualisieren des Index in mv auch random_byte_array.

Interessante Beiträge...