在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级,这比Pythonfor
循环的速度要快。过早的优化是邪恶的,l
有多大,您关心的是性能<当y
是一个集合时,y中的code>x是一个O(1),因此您当前有一个O(n)操作。