mae*_*ist 0 python arrays numpy list-comprehension pandas
问题:
我需要在long列表(~600,000个条目)和short列表(~300,000个条目)之间执行一些有点复杂的交叉引用任务.我试图找到这两个列表之间的类似条目,每个条目唯一由三个不同的整数(叫他们确定int1,int2和int3).根据一个列表中的三个整数标识符,我想看看那些相同的三个整数是否在另一个列表中,并返回它们是哪些.
尝试:
首先,我将long列表中的每个三位整数元组压缩为一个名为的数组a.同样,我将short列表中的每个三元组元组压缩为一个名为的数组b:
a = [(int1,int2,int3),...] # 600,000 entries
b = [(int1,int2,int3),...] # 300,000 entries
Run Code Online (Sandbox Code Playgroud)
然后我遍历每个条目,a看看它是否在b.如果是,我将相应的元组附加到循环外的数组中c:
c= []
for i in range(0,len(a),1):
if a[i] in b:
c.append(a[i])
Run Code Online (Sandbox Code Playgroud)
迭代(毫不奇怪)非常缓慢.我猜Python有检查b的a[i],在每次迭代(〜30万次!),和它的迭代60万次.现在已经花了一个多小时还没有完成,所以我知道我应该优化一些东西.
我的问题是:执行此交叉引用的最Pythonic或最快的方法是什么?
你可以使用套装:
c = set(b).intersection(a)
Run Code Online (Sandbox Code Playgroud)
我选择转换b为一个集合,因为它是两个列表中较短的一个.使用intersection()不要求a首先将列表转换为集合.
你也可以这样做:
c = set(a) & set(b)
Run Code Online (Sandbox Code Playgroud)
但是,两个列表都需要先转换为类型set.
无论哪种方式,您都有O(n)操作,请参阅时间复杂度.