如何在Python中使这段代码更有效?

时间:2013-10-15 03:17:40

标签: python performance loops for-loop

我无法有效地运行此嵌套for循环。我需要在长度约为90,000的字符串s上运行此循环。任何人都可以提供任何提示吗?

这段代码应该是一个字符串,并将其切成n个大小的片段,这样片段就是原始字符串的连续部分。然后程序将n的每个集合的大小返回到字符串的长度。

例如:n = 2的GATTACAT会产生{'GA','AT','TT','TA','AC','CA','AT'}。它需要这样的设置{{GA','AT','TT','TA','AC','CA'}并返回它的长度。

程序是从n = 0到n = len('GATTACAT')执行此操作,并对所有设置长度求和。

for m in range(1, len(s)+1):
    sublist = list()
    for n in range(0, len(s)-m+1):
        sublist.append(''.join(ind[n:n+m]))
    sumS += len(set(sublist))

谢谢!

2 个答案:

答案 0 :(得分:1)

一些敏捷的想法浮现在脑海中:

slen = 1 + len(s) # do this once, not a bunch of times in the loop
for m in range(1, slen):
    sublist = [''.join(ind[n:n+m]) for n in range(slen-m))] # list comps are usually faster than loops
    sumS += len(set(sublist))

实际上你可以做一个更大的理解:

slen = 1 + len(s)
sumS += sum(len(set(''.join(ind[n:n+m]) for n in range(slen-m))) for m in range(1,slen))

如果你有Python 3使用集合理解而不是上面的列表理解。

答案 1 :(得分:0)

>>> s = 'GATTACAT'

>>> [s[i:i+2] for i in range(len(s)-1)]
['GA', 'AT', 'TT', 'TA', 'AC', 'CA', 'AT']

>>> [s[i:i+3] for i in range(len(s)-2)]
['GAT', 'ATT', 'TTA', 'TAC', 'ACA', 'CAT']