[英]Intersect a set with a list of sets in python
我有一個set s
和一個set 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
。 差異是由於numpy
將for
循環下推到C級這一事實,其本質上比Python for
循環快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.