我有两个清单:
所需的输出是:
feature_list[i]
中存在List1
的i th 功能,则List2
等于1,否则为0。到目前为止,我使用的是以下代码:
feature_list = np.array([1 if (feat[1] in List2) else 0 for feat in List1])
但是你可以想象,这需要很长时间才被召唤一次。
这些帖子Stackoverflow 1,Stackoverflow 2建议使用dict
或set
,但我需要将此索引调用数千次,并且必须在每次都是相同的订单。
有什么想法吗?
答案 0 :(得分:0)
因此,您有两个列表,list1
和list2
。如果给定元素位于list1
,您的实现将检查4000次(list2
的长度)。
第一个改进是通过将list2
转换为集合来缩短In [390]: list1=sorted(random.randint(0,1000) for r in range(4000))
In [391]: list2=np.random.randint(2000, size=2000)
In [392]: %timeit np.array([1 if (feat in list2) else 0 for feat in list1])
10 loops, best of 3: 102 ms per loop
In [393]: list2=set(list2)
In [394]: %timeit np.array([1 if (feat in list2) else 0 for feat in list1])
100 loops, best of 3: 2.42 ms per loop
(因为这将删除重复项)。正如您在示例中看到的那样,在这种情况下,执行时间已从102毫秒减少到2.42毫秒。
list1
要做的另一件事是通过在字典中保存已经看过的元素的结果来避免重复list1
中相同元素的查找。通过这种方式,您可以处理In [395]: def get_feature_list():
...: d=dict.fromkeys(list2,1)
...: feature_list2=[]
...: for f in list1:
...: if f not in d:
...: d[f]=int(f in list2)
...: feature_list2.append(d[f])
...: return np.array(feature_list2)
...:
In [396]: %timeit get_feature_list()
100 loops, best of 3: 5.46 ms per loop
中的重复项。
In [440]: def get_feature_list():
...: d=[]
...: feature_list2=[]
...: for f in list1:
...: if f not in list2:
...: if f not in d:
...: d.append(f)
...: feature_list2.append(0)
...: else:
...: feature_list2.append(1)
...: return np.array(feature_list2)
...:
In [441]: list1=sorted(random.randint(0,1000) for r in range(400000))
In [443]: %timeit np.array([1 if (feat in list2) else 0 for feat in list1])
1 loop, best of 3: 273 ms per loop
In [442]: %timeit get_feature_list()
1 loop, best of 3: 1.6 s per loop
使用额外的字典来存储结果似乎并没有带来任何改进。这可能是由于创建字典的额外开销。
使用类似于上述功能的新功能,运行时间有所改善,但仅限于非常大的阵列
list2
可以做的另一件事是在找到list2
之后删除元素,这样每个步骤的大小list1
都会减少。
现在我无法想出利用files.php
进行排序以提高效率这一事实的方法。