0

このネストされた 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))

ありがとう!

4

2 に答える 2

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 を使用している場合は、上記のリスト内包表記の代わりに集合内包表記を使用してください。

于 2013-10-15T03:36:35.420 に答える
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']
于 2013-10-15T03:38:10.930 に答える