Python 如何改进此代码以提高时间效率?对于循环,质数
该任务是从 素数的间隔不是规则的。例如从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为两步式 这是我的解决方案,它工作完美,测试所需的时间比测试所需的要多,但是,我正在尝试优化此代码,以使其更具时间效率。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之间,带有两个步骤 所以这个函数应该返回两个素数的第
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]]
为了找到更好的方法,你需要考虑你方法中的缺陷
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`