Буферы и объекты Memoryview, объясненные для не-C программиста - PullRequest
10 голосов
/ 18 июля 2011

Python 2.7 представил новый API для буферов и объектов обзора памяти .

Я прочитал документацию по ним, и мне кажется, что я получил базовую концепцию (доступ к внутренним данным объекта в необработанном виде без их копирования, что, как мне кажется, означает «более быстрый и менее требовательный к памяти» способ получения объекта данные), но чтобы по-настоящему понять документацию, читатель должен обладать знаниями C, выходящими за рамки того, что у меня есть.

Я был бы очень признателен, если бы кто-нибудь нашел время:

  • объяснить буферы и объекты обзора памяти в «терминах непрофессионала» и
  • опишите сценарий, в котором использование буферов и объектов обзора памяти было бы "питонским способом" ведения дел

Ответы [ 2 ]

5 голосов
/ 18 июля 2011

Вот строка из хеш-функции, которую я написал:

M = tuple(buffer(M, i, Nb) for i in range(0, len(M), Nb))

Это разделит длинную строку M на более короткие «строки» длиной Nb, где Nb - число байтов / символов Iможет справиться одновременно.Он делает это БЕЗ копирования любых частей строки, как это было бы, если бы я сделал кусочки строки следующим образом:

M = tuple(M[i*Nb:i*Nb+Nb] for i in range(0, len(M), Nb))

Теперь я могу перебирать M так же, как если бы я его нарезал:

H = key
for Mi in M:
    H = encrypt(H, Mi)

По сути, буферы и представления памяти являются эффективными способами борьбы с неизменяемостью строк в Python и общим поведением копирования срезов и т. Д. Представление памяти подобно буферу, за исключением того, что вы также можете записывать в него,не просто читать.

В то время как основной документ о буфере / обзоре памяти посвящен реализации на C, на странице стандартных типов есть немного информации в памяти: http://docs.python.org/library/stdtypes.html#memoryview-type

Редактировать: нашел это в моемзакладки, http://webcache.googleusercontent.com/search?q=cache:Ago7BXl1_qUJ:mattgattis.com/2010/3/9/python-memory-views+site:mattgattis.com+python&hl=en&client=firefox-a&gl=us&strip=1 - ДЕЙСТВИТЕЛЬНО хорошая краткая рецензия.

Редактировать 2: Оказывается, я получил эту ссылку с Когда следует использовать просмотр памяти? во-первых, чтоНа вопрос никогда не отвечали подробно, и ссылка была мертвой, так что, надеюсь, это поможет.

1 голос
/ 13 ноября 2013

Часть ответа, который я искал, заключается в том, что buffer - это «старый путь», что memoryview - это новый способ, но был перенесен на 2.7 - см. Архивированный блог здесь

Это не отвечает на мой вопрос о том, почему API C, который, как я думал, я реализовал в 2.7, позволяет мне создать buffer, но не memoryview ...

Чтобы получить memoryviewдля работы в Python 2.7 вам необходимо установить флаг Py_TPFLAGS_HAVE_NEWBUFFER в tp_flags.Я обнаружил, что встроенный источник bytearray является хорошей ссылкой;это в Include/bytearrayobject.h и Objects/bytearrayobject.c.

...