Python arabellek tipi ne içindir?


136

bufferPython'da bir tür var , ama nasıl kullanabileceğimi bilmiyorum.

In Python doc açıklaması:

buffer(object[, offset[, size]])

Nesne bağımsız değişkeni, arabellek çağrısı arabirimini (dizeler, diziler ve arabellekler gibi) destekleyen bir nesne olmalıdır. Nesne bağımsız değişkenine başvuran yeni bir tampon nesnesi oluşturulacaktır. Arabellek nesnesi, nesnenin başından (veya belirtilen ofsetten) bir dilim olacaktır. Dilim nesnenin sonuna kadar uzanır (veya boyut argümanı tarafından verilen bir uzunluğa sahip olur).

Yanıtlar:


145

Örnek bir kullanım:

>>> s = 'Hello world'
>>> t = buffer(s, 6, 5)
>>> t
<read-only buffer for 0x10064a4b0, size 5, offset 6 at 0x100634ab0>
>>> print t
world

Bu durumda arabellek, uzunluk 6 ile konum 6'dan başlayarak bir alt dizgidir ve fazladan depolama alanı gerektirmez - dizenin bir dilimine başvurur.

Bu, bunun gibi kısa dizeler için çok yararlı değildir, ancak büyük miktarda veri kullanılırken gerekli olabilir. Bu örnekte değiştirilebilir bir dosya kullanılmıştır 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'

Veriler üzerinde birden fazla görünüme sahip olmak istiyorsanız ve birden fazla kopyayı bellekte tutmak istemiyorsanız (veya yapamıyorsanız) bu çok yararlı olabilir.

Not bufferadında daha almıştır memoryviewPython 2.7 ya kullanabilirsiniz olsa Python 3'te.

Ayrıca, C API'sine girmeden kendi nesneleriniz için bir arabellek arabirimi uygulayamayacağınızı, yani saf Python'da yapamayacağınızı unutmayın.


Açıklaman için teşekkürler. Ancak arabelleğe alma ve basit dilimleme arasındaki farkın ne olduğunu hala tam olarak anlayamıyorum. Kullanmak s[6:11]da fazladan depolama alanı gerektirmiyor, yanılıyor muyum?
satoru

9
Genel olarak bir dilim fazladan depolama alır, bu nedenle evet s[6:11]bir kopya olacaktır. Eğer ayarlarsanız t = s[6:11]ve daha sonra del s, bu tarafından çekildiği belleği boşaltır skanıtlayan tkopyalanmıştır. (Bunu görmek için daha büyük sve Python'un bellek kullanımını izlemeniz gerekir ). Ancak, çok fazla veri yoksa kopyayı oluşturmak çok daha verimlidir.
Scott Griffiths

1
Çok teşekkürler :) BTW, lütfen bana Python'un bellek kullanımını izlemek için hangi aracı kullanabileceğimi söyleyebilir misiniz?
satoru

Bellek kullanımı için örneğin stackoverflow.com/questions/110259 adresine bakın . Bazen Python'un Görev Yöneticisi / Etkinlik Monitörü / üst kısmında kullanımını izlemek en kolay yoldur.
Scott Griffiths

13
Benim gibi Python noobs için: buffer Python 3'teki memoryview
Dirk Bester

25

Ben tamponlar örneğin python yerel kütüphanelere arayüz oluştururken yararlı olduğunu düşünüyorum. (Guido van Rossum açıklıyor bufferde bu mailinglist yazı ).

Örneğin numpy, verimli veri depolama için tampon kullanıyor gibi görünüyor:

import numpy
a = numpy.ndarray(1000000)

bu a.databir:

<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.