Matrizes em Python explicadas!
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:
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:
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:
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:
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:
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:
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:





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)