Для чего нужен тип буфера Python? - PullRequest
127 голосов
/ 06 августа 2010

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

В Документе Python описание:

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

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

Ответы [ 2 ]

129 голосов
/ 06 августа 2010

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

>>> 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.

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

22 голосов
/ 06 августа 2010

Я думаю, что буферы, например, полезны при взаимодействии Python с нативными библиотеками.(Гвидо ван Россум объясняет buffer в этом сообщении рассылки ).

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

import numpy
a = numpy.ndarray(1000000)

1009 * это:

<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...