Por que vetorizar?
Vetorização refere-se à execução de operações em vetores, matrizes ou tensores inteiros em vez de elementos individuais. A vetorização remove gargalos executando operações em conjuntos de dados inteiros de uma só vez. Isso aumenta significativamente a velocidade dos códigos Python em comparação com operações executadas com loops para grandes conjuntos de dados. Assim, o Python se torna capaz de processar dados muito mais rapidamente, mesmo em dispositivos com recursos limitados.
# Comparação do tempo de execução de uma soma com um loop tradicional e com NumPy em um conjunto grande de dados
import numpy as np
import time
#loop tradicional
init = time.time()
tot = 0
for item in range(10000000):
tot = tot + item
fim = time.time()
print('resultado da soma: ' + str(tot), 'tempo de execução: ' + str(round(fim - init, 5)))
# resultado da soma: 49999995000000 tempo de execução: 0.53615
# Vetorização com NumPy
init_np = time.time()
tot = 0
tot_np = np.sum(np.arange(10000000))
fim_np = time.time()
print('resultado da soma: ' + str(tot_np), 'tempo de execução: ' + str(round(fim_np - init_np, 5)))
# resultado da soma: 49999995000000 tempo de execução: 0.01661
Vetorização com o NumPy: eficiência e aceleração
O Python possui várias bibliotecas que permitem a vetorização de códigos. NumPy é uma das melhores e a mais tradicional para essa tarefa. Ele oferece inúmeras vantagens como métodos amigáveis, otimização e broadcasting.
Em termos práticos, a vetorização com NumPy envolve o uso de arrays. Estruturas de dados como listas e DataFrames são facilmente convertidos em NumPy arrays.
Uma vez no formato de arrays, os dados estão prontos para serem processados com operações vetorizadas, dispensando o uso de loops. Assim, os códigos Python adquirem eficiência, o que é crítico em campos como IA.
No exemplo abaixo, realizamos a conversão de uma lista aninhada em um NumPy array para aplicar a operação quadrada em todos os itens de uma só vez. Com isso, evitamos o uso de funções integradas do Python ou loops explícitos que são mais lentos devido a sobrecargas de interpretação a cada iteração.
import numpy as np
lista_de_dados = [[1,2,3], [4,5,6], [7,8,9]] # Uma lista aninhada que representa uma matriz de números
dados_vetorizados = np.array(lista_de_dados)**2 # converte a lista em array e calcula o quadrado de cada elemento
Como o NumPy torna códigos Python mais rápidos?
A vetorização com NumPy aproveita loops C altamente otimizados para ganhos de desempenho e simplifica cálculos complexos. Os algoritmos otimizados do NumPy são projetados para executar operações vetorizadas com eficiência notável. Além disso, ele também aproveita recursos de hardware eficientes e processamento paralelo.
Exemplos Práticos: Operações matemáticas facilitadas
Adição
import numpy as np
# Cre dois vetores
vetor1 = np.array([1, 2, 3])
vetor2 = np.array([4, 5, 6])
# Realize a soma vetorizada
resultado = vetor1 + vetor2
print(resultado) # Output: [5 7 9]
Subtração
import numpy as np
# Crie dois vetores de gradiente
gradiente1 = np.array([0.2, 0.3, 0.4])
gradiente2 = np.array([0.1, 0.2, 0.3])
# Subtração vetorizada
diferenca = gradiente1 - gradiente2
print(diferenca) # Output: [0.1 0.1 0.1]
Multiplicação
import numpy as np
# Crie dois vetores
vetor1 = np.array([2, 3, 4])
vetor2 = np.array([5, 6, 7])
# Multiplicação elementar vetorizada
resultado = vetor1 * vetor2
print(resultado) # Output: [10 18 28]
Divisão
import numpy as np
# Crie um vetor e um escalar
vetor = np.array([10, 20, 30])
scalar = 2
# Divisão vetorizada
resultado = vetor / scalar
print(resultado) # Output: [5. 10. 15.]
Comparação de desempenho
import numpy as np
import time
# Crie dois vetores grandes
vetor_a = np.random.rand(1000000)
vetor_b = np.random.rand(1000000)
# Multiplicação com loop tradicional
tempo_inicio = time.time()
resulto_loop = []
for i in range(len(vetor_a)):
resulto_loop.append(vetor_a[i] * vetor_b[i])
tempo_fim = time.time()
print("Tempo com Loop:", tempo_fim - tempo_inicio)
# Output: Tempo com Loop: 0.20045876502990723
# Multiplicação vetorizada
tempo_inicio = time.time()
resultado_vetorizado = vetor_a * vetor_b
tempo_fim = time.time()
print("Tempo Vetorizado:", tempo_fim - tempo_inicio)
# Output: Tempo Vetorizado: 0.002400636672973633
Veja também:
Encontrou algum erro ou quer fazer uma sugestão? Por favor, entre em contato usando nosso formulário de contatos.