Функция memoryview() в Python
avatar
7 | (offline)
❤️‍🔥Notehunter Developer
Добавлено:
Категория: Основы «Python»
Комментариев: 0

В этом уроке по основам Python, мы рассмотрим функцию memoryview(). Функция memoryview() позволяет коду Python получать доступ к внутренним буферам объекта путем создания объекта представления памяти.

Что такое буферный протокол?

Это протокол на Python, который позволяет напрямую взаимодействовать со структурой данных и извлекать ее данные. Это означает, что буферный протокол обеспечивает способ доступа к внутренним данным объекта. 

Обычно мы можем получить доступ к строковым данным или целочисленным данным, но что, если мы пройдем через какой-то огромный кусок необычных данных? Здесь этот протокол позволяет объекту обмениваться своими данными. 

Этот протокол реализован на уровне C. Он доступен нам только на уровне C-API. Работа с буфером происходит быстрее, чем работа с объектом на высоком уровне Python

Буферный протокол позволяет нам получать доступ к данным в объекте данных memoryview на уровне Python без какого-либо программирования на языке C. Это означает, что объект, на котором мы собираемся использовать memoryview, должен поддерживать буферный протокол. 

Синтаксис:

memoryview(object)

Аргументы:

  • Аргументом может быть объект в байтовом значении. 

Примеры:

test_str = b'Hello, world!'

print(memoryview(test_str))
print(type(test_str))

Результат:

>>> <memory at 0x0000016EA3D1D9C0> 
>>> <class 'bytes'>

Если же мы передадим не байтовое значение, то получим ошибку: TypeError: memoryview: a bytes-like object is required, not 'str'

Мы видим, что объект memoryview печатает память по какому-то адресу. 

И что мы можем с этим делать? Теперь у нас есть доступ к хранящимся в них значениям. Давайте посмотрим, что все мы можем сделать с этим, с помощью определенных методов memoryview:

test_str = b'Hello, world!'

mem_test_str = memoryview(test_str)

print(mem_test_str.obj)
print(mem_test_str.tolist())

Результат:

>>> b'Hello, world!'
>>> [72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33]

Пояснение:

  • Метод obj - печатает исходное значение.
  • Метод tolist() - выводит значение ASCII каждой буквы

Ещё один пример, с изменением значений:

test_str = bytearray('Hello, Vladislav!', 'UTF-8')
test_str_mem = memoryview(test_str)

test_str_mem[0] = 90 # ASCII for letter Z
print(test_str_mem.tobytes())
print(test_str)

Результат:

>>> b'Zello, Vladislav!'
>>> bytearray(b'Zello, Vladislav!')
Теги записи: Python, Основы Python, memoryview(),
Комментарии к статье 0
Комментариев нет
Форма добавления комментария (необходима регистрация)