在非常大的数据集上用python生成n选择2个组合

在非常大的数据集上用python生成n选择2个组合,python,numpy,Python,Numpy,我需要创建n选择2个组合,目前正在使用pythons itertools.combinations模块 对于一个包含30000个字符串的列表,创建组合运行数小时,并使用大量内存,即 list(itertools.combinations(longlist,2)) 是否有一种生成组合的方法可以更好地优化内存中的大型对象?或者,有没有一种方法可以使用numpy来加速这个过程 通过使用二项式系数,您可以立即知道有多少个组合(30k选择2)解决此问题的方法=math.factorial(30000)/

我需要创建n选择2个组合,目前正在使用pythons itertools.combinations模块

对于一个包含30000个字符串的列表,创建组合运行数小时,并使用大量内存,即

list(itertools.combinations(longlist,2))

是否有一种生成组合的方法可以更好地优化内存中的大型对象?或者,有没有一种方法可以使用numpy来加速这个过程

通过使用二项式系数,您可以立即知道有多少个组合(30k选择2)解决此问题的方法=
math.factorial(30000)/(math.factorial(2)*math.factorial(30000-2))
=
449985000
组合


也就是说,itertools返回一个生成器,这样您就可以在它上面进行迭代,而无需将内存中的所有组合加载到一个大列表中 这些是nxn平方矩阵的上三元组的索引,其中n=
len(长列表)

问题是,首先要创建整个索引集。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')
a=np.array(长列表)
i、 j=np.triu_指数(len(a),1)
np.stack([a[i],a[j]]).T
数组(['a','b'],
[a',c'],
[b','c']],

dtype='如果你迭代而不是将其全部加载到一个列表中,它将不会使用太多的内存位……你到底想做什么?你真的需要生成所有的组合吗?或者你只需要选择一些随机的组合?或者你只需要知道有多少个?你需要如何处理这些组合?如果你删除
list
call,它只需要很少的内存,但是你一次只能得到一个组合,而不是一次得到所有组合。在任何情况下,大约有4.5亿个组合,所以你对它们做任何事情都可能需要大量的时间。你看到了吗?计算将在spark中完成,这些组合将存储在一个蜂巢中表。一个字符串距离函数将应用于特征工程对。我知道这是一个生成器,我可以通过迭代生成器来计算距离。但对于初始情况,我需要能够完全评估整个数据结构并将其保存到磁盘。您将如何将其保存到磁盘?为什么不st一次迭代200万个元素,并将每个块写入磁盘?