Python如何优化循环问题?

我要生成长度为6~17的蛋白质,并且筛选出质量为1024的。当蛋白质序列长度到12时,质量的运算很慢很拖延时间,而我要在五分钟内得到结果,请问应该如何优化?

```import itertools
dic = {
'G':57,'A':71,'S':87,'P':97,'V':99,'T':101,'C':103,'I':113,'L':113,'N':114,'D':115,
'K':128,'Q':128,'E':129,'M':131,'H':137,'F':147,'R':156,'Y':163,'W':186} #质量字典的构建
mass = 0
n=0
m = 1024
aa = dic.keys()
string = ''
list_s = []
all_list = []
def Aii(i):
m = 1
for j in range(2,i+1):
m *= j
return m
for i in range(6,18): #长度为1024的蛋白质最少有6个氨基酸(5*186+94),最多有17个氨基酸(16*57+71)
for x in itertools.combinations_with_replacement(aa,i):
for p in x:
mass += dic[p]
if mass > m:
break
if mass == m:
list_s = [''.join(x)]
print list_s
all_list.append(list_s)
mass = 0

2个回答

你用itertools.combinations_with_replacement这里有大量无效的运算。
因为如果一个组合的开头已经超过1024了,那么实际上没有必要再算下去,它和任何别的再组合都不可能符合条件。

思路类似这个:https://bbs.csdn.net/topics/390360329

第一:不要用for,用while循环,自己控制变量的递增,如果发现组合的前面几个累加已经超过1024就不要在该长度上浪费时间
第二:不要用combinations_with_replacement,自己写函数,从小到大进行组合,计算,发现超过1024就停止再组合计算

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问