我正在尝试比较两个包含 10,000+ 列表整数的巨大列表。每个子列表包含 20 个整数,这些整数在 1 到 99 之间是随机的。在子列表中,所有整数都是唯一的。
list1 = [[1, 25, 23, 44, ...], [3, 85, 9, 24, 34, ...], ...]
list2 = [[3, 83, 45, 24, ...], [9, 82, 3, 47, 36, ...], ...]
result = compare_lists(list1, list2)
compare_lists() 函数将比较处于相同位置的两个列表中的整数,如果整数不同,则返回两个列表。
遍历每个子列表显然效率非常低,因为有 1 亿+可能的组合。(列表 1 中的 10,000+ 个子列表中的每一个都与列表 2 中的 10,000+ 进行比较)
import itertools
def compare_lists(list1, list2):
for (a, b) in itertools.product(list1, list2):
count = 0
for z in range(20):
if a[z] != b[z]:
count += 1
if count == 20:
yield [a, b]
例如(我将为每个列表使用 4 个整数):
a = [1, 2, 3, 4] # True
b = [5, 6, 7, 8] # (integers are different)
a = [1, 2, 3, 4] # True
b = [2, 3, 4, 1] # (same integers but not in same position, still true)
a = [1, 2, 3, 4] # False
b = [1, 6, 7, 8] # (position [0] is identical)
在这种情况下,itertools.product
似乎效率非常低。有没有更快或更有效的方法可以做到这一点?
抱歉,如果不清楚,我最近才开始使用Python。
我不知道如何减少基于一些预先计算的数据的列表列表比较的数量。
如果数据集具有某些属性,也许您可以获得一些优势。例如,如果您知道绝大多数可能的 100M+ 对将出现在您的输出中,我将专注于查找少数被拒绝的对。如果值 V 出现在子列表的位置 P 上,则可以对数据进行分类,使每个子列表都属于大约 2K 个可能性(20 个位置 * 99 个值)中的 20 个类别 (P,V)。两个子列表比较 假 它共享一个类别。这样,您可以通过几个步骤构建一组(i,j)
对,以便list1[i]
将 False 与list2[j]
进行比较。输出比可能指数 i,j 的卡太斯乘积的其他所有内容都要多。
顺便说一句,您可以使比较比目前更有效率。
一个匹配的对a[z] == b[z]
就足以知道结果是False
。
for z in range(20):
if a[z] == b[z]:
break
else:
yield [a, b]
或同等学历:
if all(i != j for i,j in zip(a,b)):
yield [a, b]
我没有运行定时测试哪个更快。无论如何,加速可能是微不足道的。