English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Функция memoryview() возвращает объект вид памяти для заданного параметра.
Прежде чем понять, что такое вид памяти, мы должны сначала понять протокол буферизации Python.
Протокол буферизации предоставляет способ доступа к внутренним данным объекта. Внутренние данные - это массив или буфер.
Протокол буферизации позволяет объекту公开 его внутренние данные (буфер), а другой объект может получить доступ к этим буферам без промежуточного копирования.
Мы можем получить доступ к этому протоколу только на уровне C-API, а не с помощью нашей обычной библиотеки кода.
Таким образом, чтобы公开 тот же протокол для обычной библиотеки Python, необходимо использовать вид памяти.
Вид памяти является безопасным способом公开 протокол буферизации в Python.
Он позволяет вам получить доступ к внутреннему буферу объекта, создавая объект вид памяти.
Мы должны помнить, что каждый раз, когда мы выполняем какие-либо операции над объектом (вызов функции объекта, разрезание массива), Python создаетобъектаofКопия.
Если мы должны обрабатывать большое количество данных (например, двоичное представление изображений), то создание копий большого объема данных не является необходимым и почти бесполезно.
Использование протокола буферизации позволяет предоставлять доступ к другому объекту для использования/изменения больших данных без копирования их. Это позволяет программе использовать меньше памяти и увеличивает скорость выполнения.
Для использования функции memoryview() протокола буферизации памяти мы используем следующую синтаксическую конструкцию:
memoryview(obj)
функция memoryview() принимает один параметр:
Функция memoryview() возвращает объект памяти
#Случайный bytearray random_byte_array = bytearray('ABC', 'utf-8') mv = memoryview(random_byte_array) # Просмотреть нулевой индекс памяти print(mv[0]) # Создать байт из памяти print(bytes(mv[0:2])) # Создать список из памяти print(list(mv[0:3]))
Результат вывода
65 b'AB' [65, 66, 67]
Здесь мы берем из байтового массиваrandom_byte_arrayсоздал объект памятиmv.
Затем мы посещаемmvиндекса 0, 'A' и напечатать (показать ASCII-код -65).
Так же, как и из 0 и 1mvиндекс 'AB', и преобразовать его в байт.
В конце мы проанализировали все индексы mv и преобразовали их в список. Поскольку внутренний байтовый массив хранит ASCII-коды символов, выводом является список ASCII-кодов A, B и C.
# Случайный байтовый массив random_byte_array = bytearray('ABC', 'utf-8') print('До обновления:', random_byte_array) mv = memoryview(random_byte_array) # Обновить первый индекс mv на Z mv[1] = 90 print('После обновления:', random_byte_array)
Результат вывода
До обновления: bytearray(b'ABC') После обновления: bytearray(b'AZC')
Здесь мы обновляем первый индекс памяти на 90, то есть ASCII-код Z.
из-за объекта памятиmvссылается на один и тот же буфер/память, поэтому обновляетсяmvиндекс также будет обновленrandom_byte_array.