2016-11-15 4 views
2

nを2つ作成する必要があります。現在、pythons itertools.combinationsモジュールを使用しています。組み合わせを作成することが潜在的により良いメモリに大きなオブジェクト用に最適化された組み合わせを生成する方法があるすなわち非常に大きなデータセットでPythonで2つの組み合わせを選択する

list(itertools.combinations(longlist,2)) 

、時間走るとラムの多くのライブを使用しています3万文字列の単一のリストについては

、 ?または、numpyを使用してプロセスを高速化する方法がありますか?

+2

リストにすべてをロードするのではなく、それを繰り返していたら、たくさんのRAMを使うことはありません...実際に何をしようとしていますか?実際にすべての組み合わせを生成する必要がありますか?またはランダムなものを選ぶだけでいいですか?あなたはどれくらいの数があるか知る必要がありますか? –

+2

組み合わせには何が必要ですか? 'list'呼び出しを削除した場合、メモリはほとんど消費されませんが、一度に1つの組み合わせではなく、一度に1つの組み合わせしか取得できません。いずれにせよ、4億5千万もの組み合わせがあるので、それらを使って何かするとかなりの時間がかかる可能性があります。 – BrenBarn

+0

https://scipy.github.io/devdocs/generated/scipy.special.binom.htmlを見たことがありますか? – denvaar

答えて

2

あなたが瞬時にある二項係数を使用してありますどのように多くの組み合わせを知ることができ、これはmath.factorial(30000)//(math.factorial(2)*math.factorial(30000-2)) = 449985000組み合わせずに、あなたがそれを反復処理することができるようにitertoolsが発電を返すと述べ

を=解決する方法(30Kは、2を選択してください)

1

は、私はこれらの式中、n = len(long_list)

、n×nの正方行列の上部trianleの指標である np.triu_indices
に基づいて発電機を使用したい一つの大きなリストにメモリ内の全ての組み合わせをロード

問題は、インデックス全体が最初に作成されることです。 itertoolsはこれを実行せず、一度に1つの組み合わせしか生成しません。

def combinations_of_2(l): 
    for i, j in zip(*np.triu_indices(len(l), 1)): 
     yield l[i], l[j] 

long_list = list('abc') 
c = combinations_of_2(long_list) 
list(c) 

[('a', 'b'), ('a', 'c'), ('b', 'c')] 

は一度

a = np.array(long_list) 
i, j = np.triu_indices(len(a), 1) 
np.stack([a[i], a[j]]).T 

array([['a', 'b'], 
     ['a', 'c'], 
     ['b', 'c']], 
     dtype='<U1') 

タイミング
long_list = pd.DataFrame(np.random.choice(list(ascii_letters), (3, 1000))).sum().tolist()
enter image description here

でそれらのすべてを取得するには
関連する問題