Почему один из этих генераторов простых чисел быстрее другого?
В последнее время интересуются простыми тестами на простоту. У меня есть следующие две функции, которые возвращают список всех простых чисел до заданного ввода. Первое, что я сделал, другое основано на псевдокоде Википедии для тестов на простоту. Затем я немного изменил мой, чтобы быть тем, что мне показалось ближе всего к Википедии.
Когда я измеряю их время (с 10000 как вход / предел), мой занимает на порядок больше, чем другие. Я не совсем уверен, почему, что касается меня, они делают действительно похожие вещи. Мой проверяет список простых чисел с помощью "any", тогда как вики проверяет те же числа, но генерирует их с помощью цикла while. Что мне не хватает?
def my_primality(lim):
count = 5
slbprimes = [2,3];
while count<lim:
if count%3==0:
pass
elif any(count%i==0 for i in slbprimes if i**2<=count):
pass
else:
slbprimes.append(count)
count+=2
return slbprimes
def evenbetter(lim):
count = 5
ebprimes=[2,3];
while count < lim:
if count%3==0:
count+=2
continue
i=5
while i**2<=count:
if count%i==0 or count%(i+2)==0:
count+=2
break
i=i+6
else:
ebprimes.append(count)
count+=2
return ebprimes
1 ответ
any
будет проходить через весь список, чтобы увидеть, оценивается ли какой-либо из элементов в true. while
цикл прерывается быстрее, поскольку учитывает элементы в порядке возрастания. Вы можете играть с takewhile
от itertools
и вы должны получить то же время выполнения, что и цикл while.