Para que serve o tipo de buffer python?
-
26-09-2019 - |
Pergunta
Existe um buffer
Digite Python, mas não sei como posso usá -lo.
No Python Doc A descrição é:
buffer(object[, offset[, size]])
O argumento do objeto deve ser um objeto que suporta a interface de chamada buffer (como strings, matrizes e buffers). Um novo objeto buffer será criado que referencia o argumento do objeto. O objeto buffer será uma fatia do início do objeto (ou do deslocamento especificado). A fatia se estenderá ao final do objeto (ou terá um comprimento dado pelo argumento do tamanho).
Solução
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 neste caso é uma sub -string, começando na posição 6 com o comprimento 5, e não ocupa espaço de armazenamento extra - faz referência a uma fatia da corda.
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 sobre os dados e não quiser (ou não pode) manter várias cópias na memória.
Observe que buffer
foi substituído pelo melhor nomeado memoryview
no Python 3, embora você possa usar o 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, você não pode fazê -lo em python puro.
Outras dicas
Eu acho que os buffers são úteis quando interface o Python nas bibliotecas nativas. (Guido van Rossum explica buffer
dentro Esta postagem da Lista Mailing).
Por exemplo, Numpy parece usar o buffer para armazenamento de dados eficientes:
import numpy
a = numpy.ndarray(1000000)
a a.data
é um:
<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>