Matrizes em Python explicadas!

Jan 23 2023
Se você está começando a programar ou aprendendo sobre Python, este artigo é para você, arrays são uma das estruturas de dados mais usadas. Como o Python representa arrays? Como podemos manipular arrays em Python para resolver problemas diferentes? É o que vamos descobrir neste artigo.
Imagem da tela de codificação

Se você está começando a programar ou aprendendo sobre Python, este artigo é para você, arrays são uma das estruturas de dados mais usadas. Como o Python representa arrays? Como podemos manipular arrays em Python para resolver problemas diferentes? É o que vamos descobrir neste artigo.

Como os computadores armazenam informações?

Como você sabe, a forma mais primária de informação em um computador é composta de bits de informação. 8 bits dessas informações são então agrupados para formar o que chamamos de byte .

Como os computadores podem armazenar blocos muito grandes desses bytes, eles precisam de um novo mecanismo que lhes permita ler e gravar bytes rapidamente . O computador usa endereços de memória para diferenciar onde vivem diferentes partes de dados e informações.

Também vale a pena mencionar que o computador leva tempo de acesso O(1) para alcançar qualquer endereço de memória, ou seja, acessar o byte #5489637 é o mesmo que acessar o byte #64.

O que são matrizes?

Uma prática comum em linguagens de programação é usar variáveis ​​para se referir a um endereço em uma memória, por exemplo, o identificador X pode se referir ao byte #32.

Caso desejemos armazenar vários endereços de memória, a criação de vários identificadores não é eficiente e escalável. Preferiríamos mais se tivéssemos um nome para o grupo de identificadores e usássemos números para acessar identificadores específicos. Tal representação é um array, ou seja, é a representação de um grupo de variáveis ​​em uma porção contígua da memória do computador.

As strings no Python, por exemplo, são armazenadas desta forma, digamos que você declare uma nova variável com o texto 'exemplo' que o Python irá alocar:

2 byte (memória necessária para armazenar um caractere Unicode) * 7 (número de caracteres na palavra exemplo) = 14 bytes de memória contígua para armazenar esta variável.

matrizes referenciais

Python usa outro tipo de arrays que são arrays referenciais, para entendê-los vamos dar uma olhada nesse exemplo, digamos que você é dono de um hotel e tem 50 quartos, você precisa de uma forma de armazenar o nome de quem está hospedado em qual quarto então uma representação como a seguinte:

lista de nomes

para fazer isso, o Python deve respeitar a condição de espaço de memória contíguo a ser alocado. Mas como ele faz isso quando os nomes têm tamanhos diferentes (comprimentos diferentes significam requisitos de espaço diferentes)?

Uma solução seria encontrar o comprimento da maior string e alocar espaço de memória suficiente para todos, mas isso não será eficiente em termos de memória, pois algum espaço será desperdiçado e se surgir uma nova string que agora é a maior string?

Para resolver isso, o Python cria uma matriz de referências contíguas a vários objetos, portanto, embora o tamanho de cada objeto individual possa variar, a memória usada para armazenar seu endereço de memória é a mesma. Desta forma, Python garante tempo de acesso constante a diferentes elementos do array. Referimo-nos a este tipo de array como array referencial.

Para ilustrar , dê uma olhada nesta imagem:

Ilustração de uma matriz referencial

Listas e tuplas em Python usam esse tipo de array para armazenar dados.

Nota: Como matrizes referenciais apontam para referências, tenha cuidado ao alterar valores de referência, pois você também pode modificar valores em Listas por engano. Além disso, ao criar cópias, certifique-se de saber a diferença entre cópia rasa e profunda .

Arrays compactos

Anteriormente falamos sobre Strings e como as armazenamos em um array de memória contígua, na verdade chamamos esse array de Compact Array.

Uma vantagem de usar matrizes compactas sobre as referenciais é que não há sobrecarga extra de armazenamento de referências de memória, armazenamos diretamente os dados primários. Outra vantagem que vale a pena mencionar é que, no caso de usar uma lista que é um array referencial, o Python não tem controle sobre onde seus dados estão armazenados, embora a lista mantenha referências de onde os dados estão. Por causa de como o hardware funciona, é mais eficiente ter seus dados próximos uns dos outros, eles podem ser usados ​​para o mesmo cálculo.

Apesar dessas vantagens, para listas e tuplas, o Python usa matrizes referenciais, pois são convenientes de usar. No entanto, se você insistir em usar um array compacto, o Python fornece um módulo chamado array que permite fazer isso:

criando um array compacto em python

Aqui você notou que passamos i como primeiro argumento para array. Porque, para criar um array compacto, precisamos especificar o tipo para a alocação de memória adequada. Para outros tipos de dados, verifique esta tabela:

Tipos de dados na matriz

Se você quiser saber mais sobre o módulo array clique aqui .

Uma desvantagem do módulo array é que ele não oferece suporte a tipos de dados definidos pelo usuário. Arrays compactos com tal estrutura de dados podem ser definidos usando o módulo ctypes .

Matrizes Dinâmicas

Ao criar um array compacto, especificamos o tamanho preciso desse array para que o computador saiba qual memória alocar. Porque aloca a área de memória vizinha para outras matrizes.

Na prática, nem sempre podemos saber o tamanho de nossos arrays, eles podem se expandir com o tempo. Como solução para esse problema, o Python fornece uma abstração chamada Dynamic Array.

Essa abstração usa uma instância de lista que mantém uma matriz subjacente que tem capacidade maior que o comprimento da lista real. Essa capacidade extra nos ajuda a adicionar mais e mais dados à lista.

Quando finalmente esgotamos a capacidade extra, o Dynamic Array solicita um novo array maior e copia todos os elementos para o novo array e o sistema recupera o espaço do array antigo.

A Lista do Python é baseada nessa abstração, mas Tuplas e Strings são imutáveis ​​(não podem ser alteradas), portanto, não são baseadas nisso.

Também vale a pena mencionar que o array dinâmico não apenas aumenta de tamanho, mas também pode encolher se excluirmos elementos da lista.

Listas & Tuplas

Então, a partir da análise que fizemos na seção acima, podemos dividir os métodos Lists & Tuples em dois tipos de métodos:

Métodos imutáveis: métodos que existem tanto em tuplas quanto em listas e não mudam seu conteúdo. Abaixo está uma tabela desses métodos e sua complexidade de tempo:

Complexidade de métodos imutáveis

Métodos mutantes: métodos que existem apenas em listas, pois alteram os dados subjacentes e a estrutura da lista. Abaixo está uma tabela desses métodos e sua complexidade de tempo:

Complexidade dos métodos mutantes

Não discutimos aqui o que cada método faz (é intuitivo e fácil), mas você pode descobrir mais sobre as listas e tuplas do Python .

Aprendizado

  • Matrizes referenciais armazenam referências em sua memória de matriz e, em seguida, acessam os valores reais por meio das referências.
  • Matrizes compactas armazenam os dados reais em uma memória contígua.
  • Arrays dinâmicos são arrays que se expandem e encolhem automaticamente dependendo do número de elementos neles.
  • As listas são baseadas em matrizes referenciais e dinâmicas.
  • As tuplas são baseadas em matrizes referenciais.
  • String são baseados em matrizes compactas.

Linkedin:https://www.linkedin.com/in/mohamed-aziz-belaweid/

GitHub:https://github.com/azayz

Leia minhas outras histórias:

REALM: Retrieval Augmented Language Model Pré-treinamento Reconhecimento de Emoções Faciais, Guia prático!

Inscreva-se e receba uma notificação sempre que eu postar algo: