我有一组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])
答案 0 :(得分:1)
阅读此问题时,我的第一个念头是“确定,请使用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
循环固有地快。