Почему моя первая функция для поиска простого числа занимает намного больше времени, чем другая?

#python #python-3.x #optimization #primes

#питон #python-3.x #оптимизация #простые числа

Вопрос:

У меня есть две функции: isPrime и alsoPrime . Оба предназначены для возврата True или False, если число (x) является простым числом. isPrime(x, pLis) берет растущий список чисел простых чисел и смотрит, кратно ли x каким-либо простым числам. alsoPrime(x) выполняет поиск по всем нечетным числам, начинающимся с 3 и заканчивающимся корнем из x. Затем я использую цикл for, начинающийся с 3 и увеличивающийся с интервалом в 2.

Я ожидал, что isPrime будет быстрее, потому что он должен пропускать числа, т.е.:

Первичный -> 3, 5, 7, 11, 13, 17, 19

alsoPrime -> 3, 5, 7, 9, 11, 13, 15, 17, 19

Но alsoPrime это намного быстрее — в 100 раз быстрее при поиске по первым 1 000 000 номерам.

Может кто-нибудь, пожалуйста, объяснить, почему? Требуется ли много времени, чтобы звонить pLis каждый раз?

 
def isPrime(x, pLis):
    for item in pLis:
        if x % item == 0:
            return False
    return True


def alsoPrime(x):
    for i in range(3, round(x**0.5) 1, 2):
        if x % i == 0:
            return False
    return True

 

Ответ №1:

Вы просматриваете все простые числа, которые вы обнаружили, isPrime когда вам действительно нужно только перейти к квадрату кандидата, как вы это делаете alsoPrime . Больше итераций означает более медленный код. Еще один быстрый способ проверить это — подсчитать количество итераций, например:

 def isPrime(x, pLis):
    for i, item in enumerate(pLis):
        if x % item == 0:
            print(f"{x} is not prime after {i} iterations")
            return False
    print(f"{x} is prime after {i} iterations")
    return True
 

Комментарии:

1. OP уже обнаружил, что это так. Вопрос заключался в том, почему больше итераций быстрее, чем меньше.

2. Упс, я неправильно понял вопрос. Просто исправил мой ответ.

3. Конечно, большое вам спасибо! Я был настолько сосредоточен на условиях выхода для не простых чисел, что не осознавал, что в случае простого числа мне придется перебирать весь список