
def divisores(num):
    for i in range(1, num // 2 + 1):
        if num % i == 0: 
            yield i
    yield num

from math import sqrt
def divisores_otimizado(num):
    yield 1 # 1 é divisor de qualquer número
    for i in range(2, int(sqrt(num)) + 1):
        if num % i == 0:
            yield i
            outro_divisor = num // i
            if outro_divisor != i:
                yield outro_divisor
    yield num

import numpy as np
def divisores_numpy(num):
    n = np.arange(1,num)
    d = num % n
    zeros = d == 0
    return n[zeros]

from timeit import timeit

# executa 1 vez cada teste
params = { 'number' : 1, 'globals': globals() }

num = 47587950
print(timeit('for _ in divisores(num): pass', **params))
print(timeit('for _ in divisores_numpy(num): pass', **params))
print(timeit('for _ in divisores_otimizado(num): pass', **params))
print(timeit('for _ in sorted(divisores_otimizado(num)): pass', **params))
