Почему один из этих генераторов простых чисел быстрее другого?

В последнее время интересуются простыми тестами на простоту. У меня есть следующие две функции, которые возвращают список всех простых чисел до заданного ввода. Первое, что я сделал, другое основано на псевдокоде Википедии для тестов на простоту. Затем я немного изменил мой, чтобы быть тем, что мне показалось ближе всего к Википедии.

Когда я измеряю их время (с 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.

Другие вопросы по тегам