Для чего нужен тип буфера Python?
-
26-09-2019 - |
Вопрос
Eсть buffer
Тип в Python, но я не знаю, как я могу использовать его.
в Python Doc. Описание:
buffer(object[, offset[, size]])
Аргумент объекта должен быть объектом, который поддерживает интерфейс буферного вызова (например, строки, массивы и буферы). Будет создан новый буферный объект, который ссылается на аргумент объекта. Объект буфера будет срезом из начала объекта (или из указанного смещения). Ломтик будет распространен до конца объекта (или будет иметь длину, заданную по размеру аргумента).
Решение
Пример использования:
>>> s = 'Hello world'
>>> t = buffer(s, 6, 5)
>>> t
<read-only buffer for 0x10064a4b0, size 5, offset 6 at 0x100634ab0>
>>> print t
world
Буфер в этом случае представляет собой подколью, начиная с позиции 6 длиной 5, и он не принимает дополнительное хранилище - оно ссылается на ломтик строки.
Это не очень полезно для коротких строк, таких как это, но может потребоваться при использовании большого количества данных. Этот пример использует мультипликационный 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'
Это может быть очень полезно, если вы хотите иметь более одного представления на данные и не хотите (или не можете) хранить несколько копий в памяти.
Обратите внимание, что buffer
был заменен лучшим названием memoryview
В Python 3, хотя вы можете использовать в Python 2.7.
Отметим также, что вы не можете реализовать интерфейс буфера для своих собственных объектов без метки в API C, т.е. вы не можете сделать это в чистом Python.
Другие советы
Я думаю, что буферы, например, полезны при взаимодействии Python в родные библиотеки. (Гвидо Ван Россом объясняет buffer
в Этот почтовый список пост).
Например, Numpy, кажется, использует буфер для эффективных хранилищ данных:
import numpy
a = numpy.ndarray(1000000)
то a.data
это:
<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>