我有一个高(3,000,000乘2)矩阵,表示为列表列表(一个包含300万个元素的列表,每个列表包含两个元素),我需要计算每对列表的显示次数行(有可能的对数有限,大约5000)。这是我到目前为止所做的,但效率很低:
for a in list1:
for b in list2:
count_here = tall_matrix.count([a,b])
关于如何更快地提出这个想法?
非常感谢!
答案 0 :(得分:1)
使用collections.Counter
这很简单。由于您的列表包含子列表,并且子列表不可清除,因此您需要先将它们转换为元组:
In [280]: x = [[1, 2], [1, 2], [3, 4], [4, 5], [5, 6], [4, 5]]
In [282]: c = collections.Counter(map(tuple, x))
In [283]: c
Out[283]: Counter({(1, 2): 2, (3, 4): 1, (4, 5): 2, (5, 6): 1})
c
存储列表中每一对的计数。
答案 1 :(得分:0)
计数器应该可以解决问题:
测试性能(使用IPython):
In [1]: import random
In [2]: a=[(random.randint(0, 10), random.randint(0, 10)) for i in range(3000000)]
In [3]: from collections import Counter
In [4]: %time c = Counter(a)
CPU times: user 940 ms, sys: 52 ms, total: 992 ms
Wall time: 891 ms