Listas e Arrays NumPy
A escolha da estrutura de dados adequada pode impactar significativamente tanto a velocidade quanto o uso de memória. Vamos primeiro explorar listas e compará-las com arrays do NumPy para entender quando e como utilizar essas estruturas de dados de forma eficiente.
Lista
Uma list é um dos tipos de dados mais utilizados. Ela funciona como um array dinâmico, ou seja, seu tamanho pode aumentar ou diminuir conforme necessário. Listas são versáteis, oferecendo acesso e modificação eficientes em índices arbitrários. No entanto, operações como inserir ou remover elementos, e buscar por um elemento (verificar pertencimento), podem se tornar lentas em listas grandes. A exceção é a inserção ou remoção no final da lista, que permanece eficiente independentemente do tamanho da lista.
Listas são uma boa escolha nos seguintes cenários:
- Necessidade de dados ordenados;
- Acesso ou modificação frequente de elementos por índice;
- Armazenamento de diferentes tipos de dados (por exemplo, inteiros, strings ou objetos personalizados);
- Não é necessário teste rápido de pertencimento ou inserção/remoção rápida no meio da lista.
123456789101112131415my_list = [10, 20, 30] # Access an element by index print(my_list[1]) # Modify an element at a specific index my_list[1] = 50 print(my_list) # Insert an element at the end of the list my_list.append(40) print(my_list) # Remove an element from the end of the list my_list.pop() print(my_list)
Array NumPy
Embora as listas sejam versáteis, elas não são as mais eficientes para operações numéricas em grande escala. É nesse contexto que entram os arrays do NumPy.
Arrays do NumPy são implementados em C, tornando-os muito mais rápidos que listas para operações numéricas. Um fator chave é a vetorização, que permite realizar operações em arrays inteiros de uma só vez, sem a necessidade de laços explícitos. Isso resulta em ganhos significativos de desempenho, especialmente com grandes conjuntos de dados.
Veja um exemplo de como elevar ao quadrado cada elemento em uma lista (usando um for dentro de uma list comprehension) e em um array NumPy (usando vetorização):
1234567891011121314151617181920import numpy as np import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator my_list = list(range(1, 100001)) arr = np.array(my_list) @timeit_decorator(number=100) def square_list(numbers_list): return [x ** 2 for x in numbers_list] @timeit_decorator(number=100) def square_array(numbers_array): return numbers_array ** 2 sqaures_list = square_list(my_list) squares_array = square_array(arr) if np.array_equal(squares_array, sqaures_list): print('The array is equal to the list')
Como pode ser observado, a vantagem de desempenho dos arrays do NumPy é bastante evidente.
Ao lidar com dados numéricos, os arrays do NumPy oferecem uma vantagem de memória em relação às listas. Eles armazenam dados reais em blocos de memória contíguos, tornando-os mais eficientes, especialmente para grandes volumes de dados. Por serem homogêneos (mesmo tipo de dado), os arrays do NumPy evitam a sobrecarga de referências a objetos.
Em contraste, as listas são heterogêneas, armazenando referências a objetos em memória contígua, enquanto os objetos reais são armazenados em outros locais. Essa flexibilidade introduz uma sobrecarga adicional de memória ao trabalhar com dados numéricos.
Em resumo, a tabela a seguir compara listas com arrays do NumPy:
1. Você está desenvolvendo um programa para gerenciar uma coleção de objetos Sensor (classe personalizada), cada um contendo um timestamp (string) e uma reading (float). O conjunto de dados crescerá ao longo do tempo e serão necessárias atualizações frequentes nas leituras individuais dos sensores. Qual estrutura de dados seria a melhor escolha?
2. Você está trabalhando com um grande conjunto de dados numéricos para um projeto de aprendizado de máquina. Qual estrutura de dados proporcionaria o desempenho mais eficiente para essa tarefa?
3. Você está analisando dados do mercado de ações, que consistem em valores numéricos (preços) ao longo do tempo. É necessário realizar cálculos rápidos, como encontrar o preço médio e aplicar transformações matemáticas nos dados. Qual estrutura de dados você escolheria?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 7.69
Listas e Arrays NumPy
Deslize para mostrar o menu
A escolha da estrutura de dados adequada pode impactar significativamente tanto a velocidade quanto o uso de memória. Vamos primeiro explorar listas e compará-las com arrays do NumPy para entender quando e como utilizar essas estruturas de dados de forma eficiente.
Lista
Uma list é um dos tipos de dados mais utilizados. Ela funciona como um array dinâmico, ou seja, seu tamanho pode aumentar ou diminuir conforme necessário. Listas são versáteis, oferecendo acesso e modificação eficientes em índices arbitrários. No entanto, operações como inserir ou remover elementos, e buscar por um elemento (verificar pertencimento), podem se tornar lentas em listas grandes. A exceção é a inserção ou remoção no final da lista, que permanece eficiente independentemente do tamanho da lista.
Listas são uma boa escolha nos seguintes cenários:
- Necessidade de dados ordenados;
- Acesso ou modificação frequente de elementos por índice;
- Armazenamento de diferentes tipos de dados (por exemplo, inteiros, strings ou objetos personalizados);
- Não é necessário teste rápido de pertencimento ou inserção/remoção rápida no meio da lista.
123456789101112131415my_list = [10, 20, 30] # Access an element by index print(my_list[1]) # Modify an element at a specific index my_list[1] = 50 print(my_list) # Insert an element at the end of the list my_list.append(40) print(my_list) # Remove an element from the end of the list my_list.pop() print(my_list)
Array NumPy
Embora as listas sejam versáteis, elas não são as mais eficientes para operações numéricas em grande escala. É nesse contexto que entram os arrays do NumPy.
Arrays do NumPy são implementados em C, tornando-os muito mais rápidos que listas para operações numéricas. Um fator chave é a vetorização, que permite realizar operações em arrays inteiros de uma só vez, sem a necessidade de laços explícitos. Isso resulta em ganhos significativos de desempenho, especialmente com grandes conjuntos de dados.
Veja um exemplo de como elevar ao quadrado cada elemento em uma lista (usando um for dentro de uma list comprehension) e em um array NumPy (usando vetorização):
1234567891011121314151617181920import numpy as np import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator my_list = list(range(1, 100001)) arr = np.array(my_list) @timeit_decorator(number=100) def square_list(numbers_list): return [x ** 2 for x in numbers_list] @timeit_decorator(number=100) def square_array(numbers_array): return numbers_array ** 2 sqaures_list = square_list(my_list) squares_array = square_array(arr) if np.array_equal(squares_array, sqaures_list): print('The array is equal to the list')
Como pode ser observado, a vantagem de desempenho dos arrays do NumPy é bastante evidente.
Ao lidar com dados numéricos, os arrays do NumPy oferecem uma vantagem de memória em relação às listas. Eles armazenam dados reais em blocos de memória contíguos, tornando-os mais eficientes, especialmente para grandes volumes de dados. Por serem homogêneos (mesmo tipo de dado), os arrays do NumPy evitam a sobrecarga de referências a objetos.
Em contraste, as listas são heterogêneas, armazenando referências a objetos em memória contígua, enquanto os objetos reais são armazenados em outros locais. Essa flexibilidade introduz uma sobrecarga adicional de memória ao trabalhar com dados numéricos.
Em resumo, a tabela a seguir compara listas com arrays do NumPy:
1. Você está desenvolvendo um programa para gerenciar uma coleção de objetos Sensor (classe personalizada), cada um contendo um timestamp (string) e uma reading (float). O conjunto de dados crescerá ao longo do tempo e serão necessárias atualizações frequentes nas leituras individuais dos sensores. Qual estrutura de dados seria a melhor escolha?
2. Você está trabalhando com um grande conjunto de dados numéricos para um projeto de aprendizado de máquina. Qual estrutura de dados proporcionaria o desempenho mais eficiente para essa tarefa?
3. Você está analisando dados do mercado de ações, que consistem em valores numéricos (preços) ao longo do tempo. É necessário realizar cálculos rápidos, como encontrar o preço médio e aplicar transformações matemáticas nos dados. Qual estrutura de dados você escolheria?
Obrigado pelo seu feedback!