Ein Anwendungsbeispiel:
>>> s = 'Hello world'
>>> t = buffer(s, 6, 5)
>>> t
<read-only buffer for 0x10064a4b0, size 5, offset 6 at 0x100634ab0>
>>> print t
world
Der Puffer ist in diesem Fall eine Unterzeichenfolge, die an Position 6 mit der Länge 5 beginnt, und benötigt keinen zusätzlichen Speicherplatz - er verweist auf einen Teil der Zeichenfolge.
Dies ist für solche kurzen Zeichenfolgen nicht sehr nützlich, kann jedoch bei Verwendung großer Datenmengen erforderlich sein. In diesem Beispiel wird eine veränderbare Variable verwendet bytearray
:
>>> s = bytearray(1000000) # a million zeroed bytes
>>> t = buffer(s, 1) # slice cuts off the first byte
>>> s[1] = 5 # set the second element in s
>>> t[0] # which is now also the first element in t!
'\x05'
Dies kann sehr hilfreich sein, wenn Sie mehr als eine Ansicht der Daten haben möchten und nicht mehrere Kopien im Speicher halten möchten (oder können).
Beachten Sie, dass dies in Python 3 buffer
durch das besser benannte ersetzt wurde memoryview
, obwohl Sie beides in Python 2.7 verwenden können.
Beachten Sie auch, dass Sie keine Pufferschnittstelle für Ihre eigenen Objekte implementieren können, ohne sich mit der C-API zu befassen, dh Sie können dies nicht in reinem Python tun.
s[6:11]
beansprucht auch keinen zusätzlichen Speicherplatz. Liege ich falsch?s[6:11]
eine Kopie. Wenn Siet = s[6:11]
and einstellendel s
, wird der Speichers
freigegeben,t
der von kopiert wurde, und es wird bewiesen, dass dieser kopiert wurde. (Um dies zu sehen, benötigen Sie eine größeres
und verfolgen die Speichernutzung von Python). Es ist jedoch viel effizienter, die Kopie nur zu erstellen, wenn nicht viele Daten beteiligt sind.Ich denke, Puffer sind zB nützlich, wenn Python mit nativen Bibliotheken verbunden wird. (Guido van Rossum erklärt
buffer
in diesem Mailinglistenbeitrag ).Zum Beispiel scheint numpy Puffer für eine effiziente Datenspeicherung zu verwenden:
das
a.data
ist ein:quelle