Сообщить об ошибке.

Класс memoryview() в Python, ссылка на буфер обмена

Создает ссылку на объект в памяти

Синтаксис:

memoryview(object)

Параметры:

  • object - объект, поддерживающий буферный протокол.

Возвращаемое значение:

  • ссылка на объект из памяти.

Описание:

Класс memoryview() возвращает ссылку на буфер обмена памяти, в которой находится переданный в качестве аргумента объект object. Объект object должен поддерживать протокол буфера обмена.

Протокол буфера обмена поддерживают встроенные объекты, такие как bytes и bytearray.

memoryview() имеет понятие элемента, который представляет собой атомарную единицу памяти, обрабатываемую исходным объектом. Для многих простых типов, таких как bytes и bytearray, элементом является один байт, но другие типы, такие как array.array, могут иметь элементы большего размера.

Класс memoryview() обеспечивает прямой доступ для чтения и записи к байтово-ориентированным данным объекта без необходимости их предварительного копирования. Это приводит к значительному увеличению производительности при работе с большими объектами, такими как двоичные данные видео или изображения, поскольку создает другой объект доступа для изменения больших данных без их копирования.

len(view) равен длине memoryview.tolist(), который представляет собой вложенный список представления. Если view.ndim = 1, то это равно количеству элементов в представлении.

Изменено в Python 3.12: если view.ndim == 0, то len(view) теперь вызывает TypeError вместо возврата 1.

Атрибут memoryview.itemsize даст количество байт в одном элементе.

Класс memoryview() поддерживает срезы и индексацию для предоставления своих данных. Одномерная нарезка приведет к появлению подвида:

>>> v = memoryview(b'abcefg')
>>>v[1]
# 98
>>>v[-1]
# 103
>>>v[1:4]
# <memory at 0x7f3ddc9f4350>
>>>bytes(v[1:4])
# b'bce'

Если memoryview.format является одним из собственных спецификаторов формата из модуля struct, то также поддерживается индексация с использованием целого числа или кортежа целых чисел и возвращает один элемент с правильным типом. Одномерные представления памяти могут быть проиндексированы целым числом или кортежем из одного целого числа. Многомерные представления памяти могут быть проиндексированы кортежами, содержащими ровно ndim целых чисел, где ndim - количество измерений. Представления памяти нулевого размера могут быть проиндексированы с помощью пустого кортежа.

Пример с небайтовым форматом:

>>> import array
>>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444])
>>> m = memoryview(a)
>>> m[0]
# -11111111
>>> m[-1]
# 44444444
>>> m[::2].tolist()
# [-11111111, -33333333]

Если базовый объект доступен для записи, то memoryview() поддерживает назначение одномерного среза. Изменение размера не допускается:

>>> data = bytearray(b'abcefg')
>>> v = memoryview(data)
>>> v.readonly
# False
>>> v[0] = ord(b'z')
>>> data
# bytearray(b'zbcefg')
>>> v[1:4] = b'123'
>>> data
# bytearray(b'z123fg')
>>> v[2:3] = b'spam'
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# ValueError: memoryview assignment: lvalue and rvalue have different structures
>>> v[2:6] = b'spam'
>>> data
# bytearray(b'z1spam')

Одномерные memoryview() хэшируемых (доступных только для чтения) типов с форматами ‘B’, ‘b’ или ‘c’ также являются хэшируемыми. Хэш определяется как hash(m) == hash(m.tobytes()):

>>> v = memoryview(b'abcefg')
>>> hash(v) == hash(b'abcefg')
# True
>>> hash(v[2:4]) == hash(b'ce')
# True
>>> hash(v[::-2]) == hash(b'abcefg'[::-2])
# True