English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
A função memoryview() retorna um objeto de visão de memória para o parâmetro fornecido.
Antes de entender o que é visão de memória, precisamos primeiro entender o protocolo de buffer do Python.
O protocolo de buffer fornece um método para acessar os dados internos do objeto. Os dados internos são uma matriz de memória ou buffer.
O protocolo de buffer permite que um objeto divulgue seus dados internos (buffer) e outro acesse esses buffers sem cópia intermediária.
Somente em C-Acesso ao protocolo neste nível de API, mas não podemos usar nossa biblioteca de código comum.
Portanto, para tornar o mesmo protocolo público para a biblioteca de código Python comum, é necessário usar a visão de memória.
A visão de memória é um método seguro de protocolo de buffer público no Python.
Ele permite que você acesse o buffer interno do objeto criando um objeto de visão de memória.
Precisamos lembrar de que, sempre que realizarmos algumas operações no objeto (chamadas de funções do objeto, fatiamento de arrays), o Python precisa criarobjetodoCópia.
Se precisarmos lidar com grandes quantidades de dados (por exemplo, dados binários de imagens), não é necessário criar cópias desnecessárias de grandes quantidades de dados, o que é praticamente inútil.
Usando o protocolo de buffer, podemos conceder ao outro objeto acesso para usar/Modifique grandes dados sem copiá-los. Isso faz com que o programa use menos memória e aumente a velocidade de execução.
Para usar o protocolo de buffer público memoryview(), usamos a seguinte sintaxe:
memoryview(obj)
A função memoryview() aceita um único parâmetro:
obj-para tornar público seu dados internos. obj deve suportar o protocolo de buffer.bytes,bytearray)
A função memoryview() retorna um objeto de visão de memória.
#bytearray aleatório random_byte_array = bytearray('ABC', 'utf)-8) mv = memoryview(random_byte_array) # Acessar o primeiro índice da visão de memória print(mv[0) # Criar bytes a partir da visão de memória print(bytes(mv[0:2)) # Criar lista a partir da visão de memória print(list(mv[0:3))
Resultados de saída
65 b'AB' [65, 66, 67]
Aqui, a partir do array de bytesrandom_byte_arrayCriou um objeto de visão de memóriamv.
Depois disso, acessamosmvdo índice 0, 'A' e imprime (fornece o valor ASCII-65)
Da mesma forma, a partir de 0 e1 acessarmvdo índice 'AB', e convertê-lo em bytes.
Por fim, acessamos todos os índices de mv e os convertimos em uma lista. Como o array interno de bytes armazena os valores ASCII das letras, a saída é uma lista com os valores ASCII de A, B e C.
# bytearray aleatório random_byte_array = bytearray('ABC', 'utf)-8) print('Antes da atualização:', random_byte_array) mv = memoryview(random_byte_array) # Atualizar o primeiro índice de mv para Z mv[1] = 90 print('Atualizado:', random_byte_array)
Resultados de saída
Antes da atualização: bytearray(b'ABC') Atualizado: bytearray(b'AZC')
Aqui, atualizamos o primeiro índice da visão de memória para90, ou seja, o valor ASCII Z.
devido ao objeto de visão de memóriamvreferenciando o mesmo buffer/memória, portanto, atualizarmv detambém será atualizadorandom_byte_array.