Для чего нужен тип буфера Python?

В питоне есть тип buffer, но я не знаю, как его использовать.

В Python doc описание:

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

Аргумент объекта должен быть объектом, который поддерживает интерфейс вызова буфера (например, строки, массивы и буферы). Будет создан новый буферный объект, который ссылается на аргумент объекта. Объект buffer будет срезом с начала объекта (или с указанного смещения). Слайс будет расширяться до конца объекта (или будет иметь длину, заданную аргументом size).

Ответ 1

Пример использования:

>>> 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 и не занимает дополнительного пространства для хранения - он ссылается на фрагмент строки.

Это не очень полезно для коротких строк, подобных этому, но это может быть необходимо при использовании больших объемов данных. В этом примере используется mutable 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.

Обратите внимание, что вы не можете реализовать интерфейс буфера для своих собственных объектов, не вникая в C API, т.е. вы не можете сделать это в чистом Python.

Ответ 2

Я думаю, что буферы являются, например, полезно при взаимодействии python с родными библиотеками. (Guido van Rossum объясняет buffer в этот пост в списке рассылки).

Например, numpy, похоже, использует буфер для эффективного хранения данных:

import numpy
a = numpy.ndarray(1000000)

the a.data является:

<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>