Προβολή μνήμης Python ()

Η συνάρτηση memoryview () επιστρέφει ένα αντικείμενο προβολής μνήμης του δεδομένου ορίσματος.

Πριν πάμε σε ποιες είναι οι προβολές μνήμης, πρέπει πρώτα να κατανοήσουμε το πρωτόκολλο buffer της Python.

Πρωτόκολλο Python Buffer

Το πρωτόκολλο buffer παρέχει έναν τρόπο πρόσβασης στα εσωτερικά δεδομένα ενός αντικειμένου. Αυτά τα εσωτερικά δεδομένα είναι ένας πίνακας μνήμης ή ένα buffer.

Το πρωτόκολλο buffer επιτρέπει στο ένα αντικείμενο να εκθέτει τα εσωτερικά του δεδομένα (buffers) και το άλλο να έχει πρόσβαση σε αυτά τα buffer χωρίς ενδιάμεση αντιγραφή.

Αυτό το πρωτόκολλο είναι προσβάσιμο μόνο σε εμάς σε επίπεδο C-API και δεν χρησιμοποιεί την κανονική βάση κώδικα.

Έτσι, για να εκθέσουμε το ίδιο πρωτόκολλο στην κανονική βάση κώδικα Python, υπάρχουν προβολές μνήμης.

Τι είναι η προβολή μνήμης;

Η προβολή μνήμης είναι ένας ασφαλής τρόπος για να εκθέσετε το πρωτόκολλο buffer στο Python.

Σας επιτρέπει να έχετε πρόσβαση στις εσωτερικές προσωρινές μνήμες ενός αντικειμένου δημιουργώντας ένα αντικείμενο προβολής μνήμης.

Γιατί είναι σημαντικό το πρωτόκολλο buffer και οι προβολές μνήμης;

Πρέπει να θυμόμαστε ότι όποτε εκτελούμε κάποια ενέργεια σε ένα αντικείμενο (καλέστε μια συνάρτηση ενός αντικειμένου, κόψτε έναν πίνακα), η Python πρέπει να δημιουργήσει ένα αντίγραφο του αντικειμένου .

Εάν έχουμε μεγάλα δεδομένα για να εργαστούμε (π.χ. δυαδικά δεδομένα μιας εικόνας), θα δημιουργούσαμε άσκοπα αντίγραφα τεράστιων κομματιών δεδομένων, τα οποία δεν εξυπηρετούν σχεδόν καμία χρήση.

Χρησιμοποιώντας το πρωτόκολλο buffer, μπορούμε να δώσουμε σε ένα άλλο αντικείμενο πρόσβαση για χρήση / τροποποίηση των μεγάλων δεδομένων χωρίς να τα αντιγράψουμε. Αυτό κάνει το πρόγραμμα να χρησιμοποιεί λιγότερη μνήμη και αυξάνει την ταχύτητα εκτέλεσης.

Python memoryview () Σύνταξη

Για να εκθέσουμε το πρωτόκολλο buffer χρησιμοποιώντας memoryview(), χρησιμοποιούμε αυτήν τη σύνταξη:

 memoryview (obj)

memoryview () Παράμετροι

Η memoryview()συνάρτηση λαμβάνει μία μόνο παράμετρο:

  • obj - αντικείμενο του οποίου τα εσωτερικά δεδομένα πρόκειται να εκτεθούν. objπρέπει να υποστηρίζει το πρωτόκολλο buffer (bytes, bytearray)

Επιστροφή τιμής από το memoryview ()

Η memoryview()συνάρτηση επιστρέφει ένα αντικείμενο προβολής μνήμης.

Παράδειγμα 1: Πώς λειτουργεί το memoryview () στο 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)))

Παραγωγή

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

Εδώ, δημιουργήσαμε ένα αντικείμενο προβολής μνήμης mv από τον πίνακα byte random_byte_array.

Στη συνέχεια, μπήκαμε στο 0ο ευρετήριο του mv 'A'και το εκτυπώσαμε (το οποίο δίνει την τιμή ASCII - 65).

Και πάλι, αποκτήσαμε πρόσβαση στους δείκτες του mv από το 0 και το 1 'AB'και τους μετατρέψαμε σε byte.

Τέλος, αποκτήσαμε πρόσβαση σε όλους τους δείκτες του mv και το μετατρέψαμε σε λίστα. Δεδομένου ότι bytearrayαποθηκεύει εσωτερικά την τιμή ASCII για τα αλφάβητα, η έξοδος είναι μια λίστα τιμών ASCII των A, B και C.

Παράδειγμα 2: Τροποποίηση εσωτερικών δεδομένων χρησιμοποιώντας προβολή μνήμης

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

Παραγωγή

 Πριν από την ενημέρωση: bytearray (b'ABC ') Μετά την ενημέρωση: bytearray (b'AZC') 

Εδώ, ενημερώσαμε τον 1ο δείκτη της προβολής μνήμης σε 90, την τιμή ASCII του Z.

Επειδή, το αντικείμενο προβολής μνήμης mv αναφέρεται στο ίδιο buffer / μνήμη, η ενημέρωση του ευρετηρίου στο mv ενημερώνει επίσης το random_byte_array.

ενδιαφέροντα άρθρα...