Was genau ist der Punkt der Speicheransicht in Python

Überprüfen derDokumentation in der Speicheransicht:

Mit MemoryView-Objekten kann Python-Code auf die internen Daten eines Objekts zugreifen, das das Pufferprotokoll unterstützt, ohne sie zu kopieren.

KlasseSpeicheransicht(obj)

Erstellen Sie eine Speicheransicht, die auf obj verweist. obj muss das buffer protocol unterstützen. Integrierte Objekte, die das Pufferprotokoll unterstützen, umfassen Bytes und Bytearray.

Dann erhalten wir den Beispielcode:

>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'

Zitat über, schauen wir uns das jetzt genauer an:

>>> b = b'long bytes stream'
>>> b.startswith(b'long')
True
>>> v = memoryview(b)
>>> vsub = v[5:]
>>> vsub.startswith(b'bytes')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'memoryview' object has no attribute 'startswith'
>>> bytes(vsub).startswith(b'bytes')
True
>>> 

Also, was ich aus dem Obigen erfahre:

Wir erstellen ein Memoryview-Objekt, um die internen Daten eines Pufferobjekts ohne Kopieren freizulegen. Um jedoch etwas Nützliches mit dem Objekt zu tun (indem wir die vom Objekt bereitgestellten Methoden aufrufen), müssen wir eine Kopie erstellen!

Normalerweise wird MemoryView (oder das alte Pufferobjekt) benötigt, wenn wir ein großes Objekt haben, und die Slices können auch groß sein. Die Notwendigkeit einer besseren Effizienz wäre gegeben, wenn wir große oder kleine Scheiben mit einer großen Anzahl von Malen herstellen.

Mit dem obigen Schema sehe ich nicht, wie es in beiden Situationen nützlich sein kann, es sei denn, jemand kann mir erklären, was ich hier vermisse.

Edit1:

Wir haben einen großen Datenblock. Wir möchten ihn verarbeiten, indem wir ihn von Anfang bis Ende durchlaufen und beispielsweise Token vom Anfang eines Zeichenfolgenpuffers extrahieren, bis der Puffer verbraucht ist buffer, und der Zeiger kann an jede Funktion übergeben werden, die den Puffertyp erwartet. Wie kann so etwas in Python gemacht werden?

Es wird vorgeschlagen, Abhilfemaßnahmen zu treffen. Beispielsweise verwenden viele Zeichenfolgen- und Regex-Funktionen Positionsargumente, mit denen das Vorrücken eines Zeigers emuliert werden kann. Dabei gibt es zwei Probleme: Erstens müssen Sie den Codierungsstil ändern, um die Mängel zu beseitigen, und zweitens haben nicht alle Funktionen Positionsargumente, z. B. reguläre Ausdrücke undstartswith tun,encode()/decode() nicht.

Andere schlagen möglicherweise vor, die Daten in Blöcke zu laden oder den Puffer in kleinen Segmenten zu verarbeiten, die größer als das maximale Token sind. Okay, wir sind uns dieser möglichen Problemumgehungen bewusst, aber wir sollten auf natürlichere Weise in Python arbeiten, ohne zu versuchen, den Codierungsstil an die Sprache anzupassen, oder?

Edit2:

Ein Codebeispiel würde die Dinge klarer machen. Dies ist, was ich tun möchte und was ich angenommen habe, dass Memoryview es mir erlauben würde, dies auf den ersten Blick zu tun. Verwenden wir pmview (richtige Speicheransicht) für die Funktionen, nach denen ich suche:

tokens = []
xlarge_str = get_string()
xlarge_str_view =  pmview(xlarge_str)

while True:
    token =  get_token(xlarge_str_view)
    if token: 
        xlarge_str_view = xlarge_str_view.vslice(len(token)) 
        # vslice: view slice: default stop paramter at end of buffer
        tokens.append(token)
    else:   
        break

Antworten auf die Frage(5)

Ihre Antwort auf die Frage