Я довольно смущен термином «буферный интерфейс» в python. что означает «объект python, отображающий свою базовую структуру памяти», может кто-то объяснить с помощью примера. Заранее спасибоЧто касается интерфейса буфера в python
ответ
«Базовая структура памяти» относится к последовательности октетов, которые составляют объект в памяти компьютера. Например, когда вы создаете строку "abc"
, Python должен зарезервировать не менее 3 байтов памяти и хранить буквы a
, b
и c
. Если память смежная (как и в случае с строками), ее адрес и размер могут быть передается на любой фрагмент кода C, который хочет его проверить, не пройдя через служебные данные типа Python str
.
Полезным примером является тип array
. Массив - это последовательность, которая работает так же, как и список Python, с той разницей, что она содержит элементы с одним типом - вы можете иметь массив int и массив поплавков, но вы не можете их смешивать. Преимущество состоит в том, что массивы упаковывают данные как можно более эффективно, сохраняя их в плоском массиве C. Этот массив отображается через интерфейс буфера - он позволяет запросить точную позицию и размер ячейки лежащего в основе массива C и передать ее некоторой функции C, которая будет эффективно инициализировать ее или записать ее на диск. Цифровой пакет numpy
построен вокруг такого обмена данными между Python и C (и даже FORTRAN), для которого они расширили буферный протокол, а некоторые из этих расширений превратили его в Python 3.
Объект mmap
, который обеспечивает интерфейс Python для функциональности отображения памяти на уровне OS, также предоставляет интерфейс буфера. Это позволяет C-коду, который должен эффективно обращаться к памяти, такой как модуль re
, также работать с областями с отображением памяти.
Означает ли это, что каждый объект python имеет эквивалентное представление C, которое используется интерпретатором python для обработки. и мы можем получить доступ к этому представлению C для объектов, поддерживающих интерфейс буфера – user634615
@ user634615 Каждый объект Python должен быть каким-то образом представлен в памяти, а так как CPython реализован на C, представление в конечном счете основано на типах данных C. В некоторых случаях (массивы) возможно и полезно разоблачить это представление вне Python. В других случаях это либо бесполезно (как со списками, которые являются внутренними массивами внутренних указателей на объекты Python), либо совершенно невозможно (как и с dicts, которые являются внутренне хеш-таблицами с довольно сложными структурами и как таковые не могут быть представлены как единый " буфер "). – user4815162342
См. Также [это объяснение по Гвидо] (http://mail.python.org/pipermail/python-dev/2000-October/009974.html). – user4815162342