Para que serve o tipo de buffer Python?


136

Existe um buffertipo em python, mas não sei como posso usá-lo.

No documento Python, a descrição é:

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

O argumento do objeto deve ser um objeto que suporte a interface de chamada do buffer (como cadeias, matrizes e buffers). Será criado um novo objeto de buffer que referencia o argumento do objeto. O objeto de buffer será uma fatia do início do objeto (ou do deslocamento especificado). A fatia se estenderá até o final do objeto (ou terá um comprimento fornecido pelo argumento size).

Respostas:


145

Um exemplo de uso:

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

O buffer nesse caso é uma sub-string, iniciando na posição 6 com comprimento 5, e não ocupa espaço de armazenamento extra - ele faz referência a uma fatia da string.

Isso não é muito útil para seqüências curtas como essa, mas pode ser necessário ao usar grandes quantidades de dados. Este exemplo usa um mutável 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'

Isso pode ser muito útil se você quiser ter mais de uma exibição nos dados e não quiser (ou não puder) manter várias cópias na memória.

Observe que bufferfoi substituído pelo melhor nomeado memoryviewno Python 3, embora você possa usá-lo no Python 2.7.

Observe também que você não pode implementar uma interface de buffer para seus próprios objetos sem se aprofundar na API C, ou seja, não pode fazê-lo em Python puro.


Obrigado pela sua explicação. Mas ainda não entendo qual é a diferença entre buffer e fatia simples. O uso s[6:11]também não ocupa espaço de armazenamento extra, estou errado?
Satoru

9
Em geral, uma fatia precisará de armazenamento extra; portanto, sim s[6:11], será uma cópia. Se você definir t = s[6:11]e del s, em seguida , libera a memória capturada s, provando que tfoi copiada. (Para ver isso, você precisa de um tamanho maior se acompanhar o uso de memória do Python). No entanto, é muito mais eficiente apenas fazer a cópia se não houver muitos dados envolvidos.
Scott Griffiths

1
Muito obrigado :) BTW, você poderia me dizer qual ferramenta posso usar para rastrear o uso de memória do Python?
Satoru

Para uso de memória, consulte stackoverflow.com/questions/110259, por exemplo. Às vezes, é mais fácil observar o uso do Python no Gerenciador de tarefas / Activity Monitor / top.
Scott Griffiths

13
Para Python noobs como eu: tampão é memoryview em Python 3
Dirk Bester

25

Eu acho que os buffers são, por exemplo, úteis ao fazer a interface de python com bibliotecas nativas. (Guido van Rossum explica bufferem este post mailinglist ).

Por exemplo, numpy parece usar buffer para armazenamento eficiente de dados:

import numpy
a = numpy.ndarray(1000000)

o a.dataé um:

<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.