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