Python:计算长列表2中长列表1的元素的最有效方法?(列表理解真的很慢)

Python:计算长列表2中长列表1的元素的最有效方法?(列表理解真的很慢),python,pandas,numpy,Python,Pandas,Numpy,我有许多元组(例如(0,1))在两个相当长的列表中list\u 0和list\u 1,大小约为40k个元素。我还需要在list\u 1中计算list\u 0的元组 下面的列表理解语句需要~1分钟,我需要重复多次,因此我正在寻找更有效的方法: len([element for element in list_0 if element in list_1]) 还有什么能更有效 复制: elements_0 = 200*[0]+50*[1]+150*[2] elements_1 = 100*[1]+

我有许多元组(例如
(0,1)
)在两个相当长的列表中
list\u 0
list\u 1
,大小约为40k个元素。我还需要在
list\u 1
中计算
list\u 0
的元组

下面的列表理解语句需要~1分钟,我需要重复多次,因此我正在寻找更有效的方法:

len([element for element in list_0 if element in list_1])
还有什么能更有效

复制:

elements_0 = 200*[0]+50*[1]+150*[2]
elements_1 = 100*[1]+150*[2]+150*[1]
df = pd.DataFrame(data=[list(elements_0), list(elements_1)]).T
list_0 = [item for sublist in df.groupby(0)[0].apply(lambda x: list(combinations(x.index, 2))) for item in sublist]
list_1 = [item for sublist in df.groupby(1)[1].apply(lambda x: list(combinations(x.index, 2))) for item in sublist]

print(len([pair for pair in list_0 if pair in list_1])) # Long

看起来你可以用

pd.Series(list_0).isin(list_1).sum()
输出:

22300
CPU times: user 14.8 ms, sys: 20 µs, total: 14.8 ms
Wall time: 14.1 ms
应给出与以下相同的答案:

len([element for element in list_0 if element in list_1])
其中:

22300
CPU times: user 13.8 s, sys: 0 ns, total: 13.8 s
Wall time: 13.8 s
还包括
合并
和查询:

s = df.reset_index()
print(len(s.merge(s, on=[0,1])
  .query('index_x > index_y')
))
输出:

22300
CPU times: user 13.4 ms, sys: 15 µs, total: 13.4 ms
Wall time: 12.3 ms

首先设置
list_1
a集合,然后查找其中的元素:

list\u 1\u set=set(list\u 1)
打印(len(如果列表中的元素为1,则列表中的元素为0))

也许您可以尝试先对这两个列表进行排序。然后,您可以对这两个列表使用两个指针。比较两个指针上的元组是否匹配,然后更新指向列表中下一个元组的指针。这应该需要O(n)。如果有什么问题,请纠正我。谢谢。

变量名的输入错误-已更正。Thanks@Vincent请参阅更新的答案和性能比较。哇。这么快,,awesome@Vincent更新为速度稍快的解决方案。@Daniel F用numpy指出了此解决方案:您是否可以将其与前2个相同的设置进行比较?请检查您的变量名称,此代码不可复制。看起来您可能混淆了
元素\u 0
列表0
列表0
是的,我更正了,谢谢