为什么这些素数生成器中的一个比另一个快?

Why is one of these prime number generators faster than the other?

最近对简单的素性测试很感兴趣。我有以下两个函数 return 到给定输入的所有素数的列表。第一个是我做的,另一个是基于维基百科的素数测试伪代码。然后我稍微修改了我的内容,使其成为我认为最接近维基百科的内容。

当我为它们计时时(input/limit 为 10000),我的时间比另一个长一个数量级。我不太清楚为什么,对我来说他们正在做非常相似的事情。我的使用 "any" 检查素数列表,而 wiki 检查相同的数字,但使用 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 

any 将遍历整个列表以查看是否有任何元素被评估为真。 while 循环中断得更快,因为它考虑到元素是按递增顺序排列的。您可以使用 itertools 中的 takewhile,您应该得到与 while 循环类似的 运行 时间。