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

2024-10-04 05:26:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: 列表returnifdefcountanypasselse
1条回答
网友
1楼 · 发布于 2024-10-04 05:26:48

any将遍历整个列表,以查看是否有任何元素的计算结果为true。while循环中断得更快,因为它考虑到元素的顺序是递增的。您可以从itertoolstakewhile,您应该得到与while循环类似的运行时间。你知道吗

相关问题 更多 >