(Extra) Porque usar numpy?

Observe a equação abaixo:

$$ \sum_{n \neq k}^{N}abs\left(x(n)^{2}-2*x(n) \right ) $$

In [1]:
# import the libraries
import time
import random
import numpy as np

In [2]:
# Inicializar vetor com uma grande quantidade de dados aleátorios
x = [random.randint(1,10) for i in range(50000)]
np_x = np.array(x)

# Selecionar valores k para a equação
k = [4, 8, 30]

Executar a função com for loop


In [3]:
start = time.time()

# Executar 200x o código analisado
for aux in range(200):
    
    #----------------- code analysed ------------
    all_sum = 0
    for i in range(len(x)):
        if(x[i] in k):
            all_sum += abs(x[i]*x[i] - 2*x[i])
    #--------------------------------------------

end = time.time()
time_for = end - start
print('Resultado da equação: ', all_sum) 
print('Tempo de execução com \"for\": {0:.2f}s'.format(time_for))


Resultado da equação:  276440
Tempo de execução com "for": 1.72s

Executar a função com numpy


In [4]:
start = time.time()

# Executar 200x o código analisado
for aux in range(200):
    
    #----------------- code analysed ------------
    np_result = np_x[np.isin(np_x,k)]
    np_result = abs(np.square(np_result) - 2*np_result)
    all_sum_np = np.sum(np_result)
    #--------------------------------------------

end = time.time()
time_np = end - start
print('Resultado da equação: ', all_sum_np) 
print('Tempo de execução com \"numpy\": {0:.2f}s'.format(time_np))


Resultado da equação:  276440
Tempo de execução com "numpy": 0.07s

In [5]:
print('Para este exemplo a execução com numpy foi {0:.0f}x mais rápida que utilizando for'.format(time_for/time_np))


Para este exemplo a execução com numpy foi 26x mais rápida que utilizando for