我需要創建n個選擇2個組合,並且當前正在使用pythons itertools.combinations模塊。在非常大的數據集上生成n在python中選擇2個組合
對於30000串的單個列表,創建所述組合運行幾個小時,並使用RAM的許多演出,即
list(itertools.combinations(longlist,2))
是有其潛在的更好的爲在存儲器大對象優化生成的組合的方法?或者有沒有一種使用numpy來加速過程的方法?
我需要創建n個選擇2個組合,並且當前正在使用pythons itertools.combinations模塊。在非常大的數據集上生成n在python中選擇2個組合
對於30000串的單個列表,創建所述組合運行幾個小時,並使用RAM的許多演出,即
list(itertools.combinations(longlist,2))
是有其潛在的更好的爲在存儲器大對象優化生成的組合的方法?或者有沒有一種使用numpy來加速過程的方法?
你可以即刻知道有多少組合有使用二項式係數有(30K選2)的方式來解決這個問題= math.factorial(30000)//(math.factorial(2)*math.factorial(30000-2))
= 449985000
組合
提到itertools返回發生器,這樣您可以在不迭代它在存儲器中的所有的組合裝入一個大的列表
我會使用基於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()
如果你迭代而不是將它全部加載到列表中,它不會使用許多ram演出......你究竟在做什麼?你真的需要生成所有的組合?或者你只需要選擇一些隨機的?或者你只需要知道有多少? –
你需要怎樣處理組合?如果你刪除了'list'調用,它會佔用很少的內存,但是你一次只能得到一個組合,而不是一次。無論如何,有大約4.5億個組合,所以你對它們做的任何事情都可能花費大量的時間。 – BrenBarn
你見過https://scipy.github.io/devdocs/generated/scipy.special.binom.html嗎? – denvaar