0

文字のさまざまな順列を行う python スクリプトを書いています。最終的に、順列の深さによっては、メモリ不足エラーでスクリプトがクラッシュします。

最初は、解決策はリストを空にして最初からやり直すことだと思っていましたが、このようにすると、インデックスが範囲外のエラーが発生します。

これは私の現在の設定です:

for j in range(0, csetlen):
    getJ = None
    for i in range(0, char_set_len):
        getJ = word_list[j] + char_set[i]
        word_list.append(getJ)

    csetlen = csetlen - j
    del word_list[j-1:]
    word_list.append(getJ)
    j=0

基本的にcsetlen、非常に大きな数 (100,000,000 を超える) になる可能性があります。もちろん、これには十分な RAM がありません。forそのため、外側のループでリストを縮小する方法を見つけようとしています。これを優雅に行うにはどうすればよいでしょうか。

メモリ エラーは に関係していword_listます。現在、何百万もの異なる順列を保存しています。古いリストの値の一部を「リサイクル」できるようにする必要があります。Pythonリストに対してこれを行うにはどうすればよいですか?

4

1 に答える 1

1

必要なのは、必要に応じて値を生成する (メモリに格納しない) イテレータです。

from itertools import product
getJ_iterator = product(wordlist[:csetlen], char_set[:char_set_len]) 

これは、次のジェネレータ関数と同等です。

def getJ_gen(first_list, second_list):
    for i in first_list:
        for j in second_list:
            yield (i, j)

getJ_iterator = getJ_gen(wordlist[:csetlen], char_set[:char_set_len])

次のようにオブジェクトを反復処理します。

for item in getJ_iterator:
    #do stuff

itemこの場合、フォームのタプルになることに注意してください(word, char)

于 2012-09-23T03:49:38.453 に答える