我试图比较两个包含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亿个+可能的组合。 (list1中的10,000多个子列表中的每一个都与list2中的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]
例如(i'每个列表使用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。
答案 0 :(得分:0)
我不知道如何根据一般预先计算的数据减少列表列表比较的数量。
如果数据集具有某些属性,也许您可以获得一些优势。例如,如果您知道绝大多数可能的100M +对将在您的输出中,我将专注于找到少数被拒绝的对。如果值V出现在子列表中的位置P上,则可以对数据进行分类,使得每个子列表属于大约2K种可能性的20个类别(P,V)(20个位置* 99个值)。两个子列表比较False它们共享一个类别。这样,您可以在几个步骤中构建一组var tmp = fStream.ReadByte();
if (tmp == -1)
// end of file reading
else
byteBuffer[index] = Convert.ToByte(tmp);
对,以便(i,j)
将False与list1[i]
进行比较。输出是来自可能的指数i,j的贝塞斯特乘积的其他所有东西。
一对匹配list2[j]
就足以知道结果为a[z] == b[z]
。
False
或同等的:
for z in range(20):
if a[z] == b[z]:
break
else:
yield [a, b]
我没有进行计时测试哪一个更快。无论如何,加速可能是微不足道的。