English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Python

Управление потоком в Python

Функции Python

Типы данных Python

Операции с файлами в Python

Объекты и классы в Python

Даты и время в Python

Продвинутые знания Python

Руководство по Python

Метод использования функции memoryview() в Python и примеры

Внутренние функции Python

Функция memoryview() возвращает объект вид памяти для заданного параметра.

Прежде чем понять, что такое вид памяти, мы должны сначала понять протокол буферизации Python.

Протокол буферизации Python

Протокол буферизации предоставляет способ доступа к внутренним данным объекта. Внутренние данные - это массив или буфер.

Протокол буферизации позволяет объекту公开 его внутренние данные (буфер), а другой объект может получить доступ к этим буферам без промежуточного копирования.

Мы можем получить доступ к этому протоколу только на уровне C-API, а не с помощью нашей обычной библиотеки кода.

Таким образом, чтобы公开 тот же протокол для обычной библиотеки Python, необходимо использовать вид памяти.

Что такое вид памяти?

Вид памяти является безопасным способом公开 протокол буферизации в Python.

Он позволяет вам получить доступ к внутреннему буферу объекта, создавая объект вид памяти.

Почему важны протокол буферизации и вид памяти?

Мы должны помнить, что каждый раз, когда мы выполняем какие-либо операции над объектом (вызов функции объекта, разрезание массива), Python создаетобъектаofКопия.

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

Использование протокола буферизации позволяет предоставлять доступ к другому объекту для использования/изменения больших данных без копирования их. Это позволяет программе использовать меньше памяти и увеличивает скорость выполнения.

Синтаксис функции memoryview() в Python

Для использования функции memoryview() протокола буферизации памяти мы используем следующую синтаксическую конструкцию:

memoryview(obj)

параметр memoryview()

функция memoryview() принимает один параметр:

  • obj- Объект, который должен公开其内部数据. obj должен поддерживать протокол буферизации (bytes,bytearray)

Возврат значения memoryview()

Функция memoryview() возвращает объект памяти

Пример 1: Как использовать memoryview() в Python?

#Случайный 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.

Пример 2: Использование памяти для изменения внутренних данных

# Случайный байтовый массив
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.

Внутренние функции Python