1
resposta

Estruturas de Repetição - Hora Da Pratica Problema 7

Eu comparei minha solução para o problema 7, que determina se um número é primo, com a solução do instrutor fornecida. Eu acredito que a solução que eu tenho é muito mais eficiente, e gostaria de obter uma opinião sobre isso, por favor.o A solução fornecida é:

if num > 1:
    for i in range(2, num):
        # verificamos todos os restos de divisões entre todos os números abaixo de num
        # se algum resto for 0, então ele é divisível por outro número além dele e 1
        if (num % i) == 0:
            print(f'{num} não é um número primo')
            break
        else:
            print(f'{num} é um número primo')
else:
    print(f'{num} não é um número primo')

E a minha solução é:

if n > 1:
 #If n is 1, 0, or negative it is not prime #
  for i in range(2, int(n/2) + 1):
    if (n % i) == 0:
      print(f"{n} is not prime.")

      break
  else:
    print(f"{n} is prime!")
else:
    print(f"{n} is not prime")

Porque eu utilizei range(2, n/2 + 1), eu eliminei metade das iterações para range(2, n). Estou correto com isso?

1 resposta

Oi, David! Tudo bem com você?

Dependendo do número analisado, talvez a sua proposta não apresente o caminho mais eficiente. A operação de divisão (feita em seu programa no trecho de n/2) é computacionalmente mais "cara" do que a operação de subtração (realizada no código da aula, no momento em que verificamos num-1 vezes se todos os números de 2 são divisores de num).

Nesse sentido, mesmo que o seu código faça menos verificações, a operação de divisão adicional pode deixá-lo mais lento. Uma forma legal de testar essa situação é observando quanto tempo cada programa leva para afirmar se um número extremamente extenso é primo ou não. No código abaixo, usei o módulo time, do Python, para extrair essa informação:

import time

n = 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
tempo_inicial = time.time()

if n > 1:
    for i in range(2, int(n/2) + 1):
        if (n % i) == 0:
            print(f"{n} is not prime.")
            break
    else:
        print(f"{n} is prime!")
else:
    print(f"{n} is not prime")

tempo_final = time.time()

duracao_tempo = tempo_final - tempo_inicial
print(f"Duração: {duracao_tempo} segundos")

Antes de começar o programa em si, contabilizei o tempo inicial com time.time(). Ao final da execução, realizei o mesmo passo e subtraí os valores de tempo_final e tempo_inicial, obtendo a duração em segundos desta execução!

Você pode replicar este mesmo passo a passo para o código do curso e, então, comparar a eficiência de cada processo. Caso queira explorar um pouco mais este módulo, você pode acessar o material abaixo, David:

Vale enfatizar que nem sempre os resultados serão os mesmos.

Quando estamos desenvolvendo um programa, precisamos pensar em estratégias para deixá-lo "pythônico". Geralmente, isso depende de múltiplas questões, sendo a eficiência uma delas. Além disso, diante de situações como esta, é bem interessante analisar casos mais extremos (como este que mostrei), pois geralmente são eles que nos mostram a eficiência do nosso projeto em um cenário do mundo real.

Espero que tenha ficado mais claro, David! A sua sugestão também é uma possibilidade bem bacana, fico feliz que tenha identificado uma maneira distinta de resolver o desafio. :)

Sempre que precisar, conte com o fórum.

Um abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!