在python中,将集合与集合列表相交

在python中,将集合与集合列表相交,python,python-3.x,set,Python,Python 3.x,Set,我有一套s和一套l列表,如下所示 s = {1,2,3,4} l = [{1}, {1,2,3}, {3}] 输出应该是 out = [{1}, {1,2,3}, {3}] 我使用以下代码来完成它。但我希望有一个更快的方法?也许是某种广播 out = [i.intersection(s) for i in l] 编辑 列表l可以长达1000个元素 我的最终目标是创建一个矩阵,该矩阵具有l元素成对相交的元素长度。所以s是l的一个元素 out_matrix = list() for s in

我有一套
s
和一套
l
列表,如下所示

s = {1,2,3,4}
l = [{1}, {1,2,3}, {3}]
输出应该是

out = [{1}, {1,2,3}, {3}]
我使用以下代码来完成它。但我希望有一个更快的方法?也许是某种广播

out = [i.intersection(s) for i in l]
编辑

列表
l
可以长达1000个元素

我的最终目标是创建一个矩阵,该矩阵具有
l
元素成对相交的元素长度。所以
s
l
的一个元素

out_matrix = list()
for s in l:
    out_matrix.append([len(i.intersection(s)) for i in l])

阅读这个问题时,我的第一个想法是“当然,使用
numpy
”。然后我决定做一些测试:

import numpy as np
from timeit import Timer

s = {1, 2, 3, 4}
l = [{1}, {1, 2, 3}, {3}] * 1000  # 3000 elements
arr = np.array(l)


def list_comp():
    [i.intersection(s) for i in l]


def numpy_arr():
    arr & s

print(min(Timer(list_comp).repeat(500, 500)))
print(min(Timer(numpy_arr).repeat(500, 500)))
这个输出

# 0.05513364499999995
# 0.035647999999999236
所以
numpy
确实要快一点。真的值得吗?不确定。3000个元素列表的
~0.02
秒差异是可以忽略的(特别是考虑到我的测试甚至没有考虑创建
arr
所需的时间)

请记住,即使在使用
numpy
时,我们仍然处于O(n)的范围内。这种差异是因为
numpy
for
循环向下推到了C级,这比Python
for
循环的速度要快。

过早的优化是邪恶的,
l
有多大,您关心的是性能<当
y
是一个集合时,y中的code>x是一个O(1),因此您当前有一个O(n)操作。