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


136

Існує bufferтип python, але я не знаю, як це можна використовувати.

У документі Python опис:

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

Аргумент об'єкта повинен бути об’єктом, який підтримує інтерфейс виклику буфера (наприклад, рядки, масиви та буфери). Буде створений новий об'єкт буфера, який посилається на аргумент об'єкта. Об'єктом буфера буде фрагмент від початку об'єкта (або від зазначеного зміщення). Фрагмент пошириться на кінець об'єкта (або матиме довжину, задану аргументом розміру).

Відповіді:


145

Приклад використання:

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


Дякуємо за ваше пояснення. Але я все ще не зовсім розумію, у чому різниця між буферизацією та простим нарізанням. Використання s[6:11]також не займає зайвого місця для зберігання, я помиляюся?
satoru

9
Зазвичай фрагмент займе додаткове сховище, так що так s[6:11]- це копія. Якщо встановити t = s[6:11]і потім del s, це звільнить пам'ять, яку забрав s, довівши, що вона tбула скопійована. (Щоб побачити це, вам потрібно збільшити sі відстежити використання пам'яті Python). Однак набагато ефективніше зробити копію, якщо задіяно не так багато даних.
Скотт Гріффітс

1
Дуже дякую :) BTW, не могли б ви сказати, який інструмент я можу використовувати для відстеження використання пам'яті Python?
satoru

Про використання пам'яті див. Наприклад stackoverflow.com/questions/110259 . Іноді найпростіше просто спостерігати за використанням Python в диспетчері завдань / Моніторі діяльності / вгорі.
Скотт Гріффітс

13
Для нобіїв Python, як я: буфер - це перегляд пам’яті в Python 3
Дірк Бестер

25

Я думаю, що буфери корисні, наприклад, під час взаємодії python з рідними бібліотеками. (Гюдо ван Россум пояснює bufferв цій публікації розсилки ).

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

import numpy
a = numpy.ndarray(1000000)

a.dataє:

<read-write buffer for 0x1d7b410, size 8000000, offset 0 at 0x1e353b0>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.