Python memoryview ()

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. objdeve 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 bytearrayarmazena 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.

Artigos interessantes...