A função memoryview () retorna um objeto de visualização de memória do argumento fornecido.
Antes de entrarmos no que são visualizações de memória, precisamos primeiro entender sobre o protocolo de buffer do Python.
Protocolo de Buffer Python
O protocolo de buffer fornece uma maneira de acessar os dados internos de um objeto. Esses dados internos são uma matriz de memória ou um buffer.
O protocolo de buffer permite que um objeto exponha seus dados internos (buffers) e o outro acesse esses buffers sem cópia intermediária.
Este protocolo só está acessível para nós no nível C-API e não usando nossa base de código normal.
Portanto, para expor o mesmo protocolo à base de código Python normal, as visualizações de memória estão presentes.
O que é uma visão da memória?
Uma visão de memória é uma maneira segura de expor o protocolo de buffer em Python.
Ele permite que você acesse os buffers internos de um objeto criando um objeto de visualização de memória.
Por que o protocolo de buffer e as visualizações de memória são importantes?
Precisamos lembrar que sempre que executamos alguma ação em um objeto (chamamos uma função de um objeto, dividimos um array), o Python precisa criar uma cópia do objeto .
Se tivermos grandes dados para trabalhar (por exemplo, dados binários de uma imagem), criaríamos desnecessariamente cópias de grandes blocos de dados, o que quase não tem uso.
Usando o protocolo de buffer, podemos dar acesso a outro objeto para usar / modificar os dados grandes sem copiá-los. Isso faz com que o programa use menos memória e aumenta a velocidade de execução.
Python memoryview () Sintaxe
Para expor o protocolo de buffer usando memoryview()
, usamos esta sintaxe:
visão da memória (obj)
Parâmetros memoryview ()
A memoryview()
função tem um único parâmetro:
- obj - objeto cujos dados internos devem ser expostos.
obj
deve suportar o protocolo de buffer (bytes, bytearray)
Valor de retorno de memoryview ()
A memoryview()
função retorna um objeto de visualização da memória.
Exemplo 1: Como funciona o memoryview () em Python?
#random bytearray random_byte_array = bytearray('ABC', 'utf-8') mv = memoryview(random_byte_array) # access memory view's zeroth index print(mv(0)) # create byte from memory view print(bytes(mv(0:2))) # create list from memory view print(list(mv(0:3)))
Resultado
65 b'AB '(65, 66, 67)
Aqui, criamos um objeto de visualização de memória mv a partir do array de bytes random_byte_array.
Então, acessamos o índice 0 do mv,, 'A'
e o imprimimos (o que dá o valor ASCII - 65).
Novamente, acessamos os índices de mv de 0 e 1 'AB'
e os convertemos em bytes.
Por fim, acessamos todos os índices de mv e os convertemos em uma lista. Visto que bytearray
armazena internamente o valor ASCII para os alfabetos, a saída é uma lista de valores ASCII de A, B e C.
Exemplo 2: modificar os dados internos usando a visualização da memória
# random bytearray random_byte_array = bytearray('ABC', 'utf-8') print('Before updation:', random_byte_array) mv = memoryview(random_byte_array) # update 1st index of mv to Z mv(1) = 90 print('After updation:', random_byte_array)
Resultado
Antes da atualização: bytearray (b'ABC ') Após a atualização: bytearray (b'AZC')
Aqui, atualizamos o primeiro índice da visualização da memória para 90, o valor ASCII de Z
.
Visto que o objeto de visualização de memória mv faz referência ao mesmo buffer / memória, atualizar o índice em mv também atualiza random_byte_array.