【问题标题】:Why is one of these prime number generators faster than the other?为什么这些素数生成器中的一个比另一个更快?
【发布时间】:2016-01-22 17:20:45
【问题描述】:

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

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

【问题讨论】:

  • my_primality 中的一个小优化是使用for count in range(5,lim,2)xrange 如果您在python 2 中,这样您就可以避免不断检查count&lt;lim 并免费获得count+=2
  • 哦,谢谢。这是非常正确的。

标签: python time any primality-test


【解决方案1】:

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

【讨论】:

  • 所以你是说any停留在第一个真实的陈述吗?
  • 如果找到正确的语句,它将停止,但如果没有正确的语句,它将尝试数组中的所有元素,并且不会利用它可以在if i**2&lt;=count 失败时提前中断。 while 循环确实利用了这一点。
猜你喜欢
  • 2014-05-19
  • 1970-01-01
  • 2020-07-30
  • 2014-07-13
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多