2016-11-15 25 views
2

我需要創建n個選擇2個組合,並且當前正在使用pythons itertools.combinations模塊。在非常大的數據集上生成n在python中選擇2個組合

對於30000串的單個列表,創建所述組合運行幾個小時,並使用RAM的許多演出,即

list(itertools.combinations(longlist,2)) 

是有其潛在的更好的爲在存儲器大對象優化生成的組合的方法?或者有沒有一種使用numpy來加速過程的方法?

+2

如果你迭代而不是將它全部加載到列表中,它不會使用許多ram演出......你究竟在做什麼?你真的需要生成所有的組合?或者你只需​​要選擇一些隨機的?或者你只需​​要知道有多少? –

+2

你需要怎樣處理組合?如果你刪除了'list'調用,它會佔用很少的內存,但是你一次只能得到一個組合,而不是一次。無論如何,有大約4.5億個組合,所以你對它們做的任何事情都可能花費大量的時間。 – BrenBarn

+0

你見過https://scipy.github.io/devdocs/generated/scipy.special.binom.html嗎? – denvaar

回答

2

你可以即刻知道有多少組合有使用二項式係數有(30K選2)的方式來解決這個問題= math.factorial(30000)//(math.factorial(2)*math.factorial(30000-2)) = 449985000組合

提到itertools返回發生器,這樣您可以在不迭代它在存儲器中的所有的組合裝入一個大的列表

1

我會使用基於np.triu_indices
這些是n×n的正方形矩陣的上trianle,的索引的發電機,其中n = len(long_list)

問題是整個索引集都是先創建的。 itertools不會這樣做,只能一次生成每個組合。

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

相關問題