0

最近对简单的素性测试感兴趣。我有以下两个函数,它们返回给定输入之前的所有素数列表。我制作的第一个,另一个是基于维基百科的素性测试伪代码。然后,我将我的稍微修改为我认为最接近维基百科的。

当我给它们计时(输入/限制为 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 
4

1 回答 1

0

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

于 2016-01-22T17:26:28.167 回答