我需要创建n选择2个组合,目前正在使用pythons itertools.combinations模块。
对于30,000个字符串的单个列表,创建组合运行数小时并使用许多ram演出,即
list(itertools.combinations(longlist,2))
是否有一种生成组合的方法可能更好地优化内存中的大对象?或者有一种方法可以使用numpy来加速这个过程吗?
答案 0 :(得分:2)
你可以通过使用二项式系数立即知道有多少组合有(30k选择2)方法来解决这个问题= math.factorial(30000)//(math.factorial(2)*math.factorial(30000-2))
= 449985000
组合
表示itertools返回一个生成器,因此您可以迭代它而不将内存中的所有组合加载到一个大列表中
答案 1 :(得分:2)
我使用基于np.triu_indices
的发电机
这些是nxn方阵的上三元组的索引,其中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()