Python 如何改进此代码以提高时间效率?对于循环,质数

Python 如何改进此代码以提高时间效率?对于循环,质数,python,list,for-loop,if-statement,primes,Python,List,For Loop,If Statement,Primes,该任务是从 素数的间隔不是规则的。例如从2到3 步骤是1。从3到5,步骤是2。从7点到11点是4点。 在2到50之间,我们有以下两对2步素数: 3,5-5,7-11,13-17,19-29,31-41,43 我们将编写一个带有参数的函数步骤: g(整数>=2),表示我们要查找的步骤 m(整数>=2),它给出搜索的开始(包括m) n(整数>=m)表示搜索结束(包括n) 在上面的示例中,步骤(2,2,50)将返回[3,5],这是 第一对介于2和50之间,带有两个步骤 所以这个函数应该返回两个素数的第

该任务是从

素数的间隔不是规则的。例如从2到3 步骤是1。从3到5,步骤是2。从7点到11点是4点。 在2到50之间,我们有以下两对2步素数:

3,5-5,7-11,13-17,19-29,31-41,43

我们将编写一个带有参数的函数步骤:

g(整数>=2),表示我们要查找的步骤

m(整数>=2),它给出搜索的开始(包括m)

n(整数>=m)表示搜索结束(包括n)

在上面的示例中,步骤(2,2,50)将返回[3,5],这是 第一对介于2和50之间,带有两个步骤

所以这个函数应该返回两个素数的第一对 如果这些g步数为素数,则在限制m和n之间间隔g步数 数字存在,否则为零或空或无或无或[]或“0,0” 或{0,0}或0(取决于语言)

示例:步骤(2,5,7)->[5,7]或(5,7)或{5,7}或“57”

第(2,5,5)步-->零或。。。或Ocaml中的[]或C中的{0,0}++

步骤(4130200)->[163167]或(163167)或{163167}

在“测试”中查看有关您的语言的更多示例

备注:([193197]也是这样一个4步素数,介于130和200之间 但这不是第一对)

步骤(6100110)->[101107]尽管101和101之间有一个素数 107即103;线对101-103为两步式

这是我的解决方案,它工作完美,测试所需的时间比测试所需的要多,但是,我正在尝试优化此代码,以使其更具时间效率。

def step(g,m,n):

    count = 0
    list= []
    list2 = []
    for num in range(m,n+1):
        if all(num%i!=0 for i in range(2,num)):
            count += 1
            list.append(num)
    

        
    for k in list:
        for q in list:
            if (q-k) > 0:
                if (q-k) == g:
                    list2.append(k)
                    list2.append(q)
            

                
    if not list2:
         return 
    else:
         return  [list2[0],list2[1]]

如果您有任何建议或示例代码,我将不胜感激。首先,不要将关键字用作变量

def step(g,m,n):

    count = 0
    list= []
    list2 = []
    for num in range(m,n+1):
        if all(num%i!=0 for i in range(2,num)):
            count += 1
            list.append(num)
    

        
    for k in list:
        for q in list:
            if (q-k) > 0:
                if (q-k) == g:
                    list2.append(k)
                    list2.append(q)
            

                
    if not list2:
         return 
    else:
         return  [list2[0],list2[1]]
为了找到更好的方法,你需要考虑你方法中的缺陷

  • 您正在遍历所有数字以确定素数
  • 您正在迭代O(n**2)中的列表,以查找是否存在具有所需差异的对
  • 你的素数计算算法不是最优的
  • 对于第一点,甚至不需要查找给定范围内的所有素数,因为您的任务是查找具有所需差异的第一对。所以,如果你找到号码
    a
    作为素数,
    a+g
    也是素数,那么您已经找到了解决方案

    对于第二点,您可以简单地遍历列表,并检查列表中的
    if(k+g)
    以查找是否找到了该对

    关于第三点,您可以在wikipedia页面上找到一个最佳实现。如果您能够理解逻辑,那么您可以非常轻松地自己编写该实现

    因此,将最优素数检查实现与单循环迭代相结合,可以很容易地编写解决方案,如下所示

    从functools导入lru\U缓存
    @lru_缓存(无)
    def是_prime(n):
    如果n1
    如果n%2==0或n%3==0:
    返回错误
    i=5
    
    我亲爱的纳文,我使用了你的算法,效果很好。但是,我按以下方式更改了is_prime函数:`if all(n%I!=0,对于范围(2,n)中的I):返回True,否则:False`