在Python中执行Find方法的最快方法

时间:2017-05-06 14:15:27

标签: python-2.7 list python-3.x indexing find

我有两个清单:

  • List1是1x4000, Ordered 功能列表(订单对我的其余代码至关重要)
  • List2是随机长度,是我需要从中提取特征的列表。

所需的输出是:

  • 大小为1x4000的二进制文件的numpy列表,如果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 1Stackoverflow 2建议使用dictset,但我需要将此索引调用数千次,并且必须在每次都是相同的订单

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

因此,您有两个列表,list1list2。如果给定元素位于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进行排序以提高效率这一事实的方法。