文章目录
有这么一个需求,我们有一个列表A,里面有10万条数据,现在另外有一个列表B,里面有1万条数据,其中这1万条数据一定包含在10万条数据里面,而且这1万条数据里面有可能有重复的数据出现,我们需要在10万条数据里面,找出那不是B里面的数据。
In [15]: from itertools import product
In [16]: a = list(product(range(10), repeat=5))
为了方便,我们直接使用了
product
这个函数,产生了一个10万个元素的列表,每个元素就是一个元组,元组有5个元素,是从0-9里面的组合,也就是10的5次方,产生了10万个不同的数据,product
函数具体使用,请参考官方的说明,这里只需要知道产生的结果即可。
那为了方便起见,我们直接从a里面选择了前10000个数据作为b列表的内容。
In [19]: b = a[:10000]
看一下我们的筛选方式一:
In [20]: ret = []
In [21]: for i in a:
...: if i not in b:
...: ret.append(i)
...:
In [22]: len(ret)
Out[22]: 90000
上面的运行了接近22秒,因为for
循环需要10万次,每次都需要判断当前元素是否在b中。
我们换一下,看看筛选方式二:
In [32]: from copy import deepcopy
In [33]: ret = deepcopy(a)
In [34]: for i in b:
...: if i in ret:
...: ret.remove(i)
...:
In [35]: len(ret)
Out[35]: 90000
运行时间接近两秒,直接把原始内容copy了一份到结果ret里面,这里耗时接近1秒,然后循环里面,只循环了b,也就是1万次,然后调用列表的remove
函数移除元素,达到了我们的结果。
我们最后来看一看几乎是微妙级别的计算方式:
In [37]: len(a)
Out[37]: 100000
In [38]: len(b)
Out[38]: 10000
In [39]: ret = set(a) - set(b)
In [40]: len(ret)
Out[40]: 90000
通过timeit模块测试的结果是,0.0023,对,我们使用了python里面集合这个概念,直接通过集合的减法获得了我们的结果。
所以选对方法完全可以在达到同样的目的的情况下提升我们的运行效率哦,至少第一个例子的20几秒,一般情况下是完全不能忍受的。