Вопрос

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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top