我列出了在构造上应该是唯一的元素列表。我的意思是,列表中没有元素会出现一次以上。
我想有效地测试该列表中是否存在某个项目,以及很多项目是否存在。
如果将列表转换为集合,则测试效率更高。
现在我的问题是关于如何有效地构建集合。
我猜想当我做my_set = set(my_list)
时,python必须逐步构建集合,因此必须以某种方式测试列表中项目的成员资格。
考虑到我知道列表不包含重复项,这不是次优的吗?
有可能做得更好吗?
如果我有一个迭代器(而不是列表)(我仍然知道它将产生的项目将是唯一的),那么上述问题的答案是否会改变?
python大神给出的解决方案
由于set()
使用哈希表(请参见How is set() implemented?),因此散列将花费比比较更多的时间,这是不可避免的。
如果您担心性能,我认为您的数据集非常大。要获得更好的性能,唯一的方法是首先创建set()
并避免使用list()
的中间内存。
$ python3 -m timeit 'set(list(range(100000)))'
100 loops, best of 3: 8.69 msec per loop
$ python3 -m timeit 'set(range(100000))'
100 loops, best of 3: 7.67 msec per loop
$ python3 -m timeit 'frozenset(range(100000))'
100 loops, best of 3: 7.68 msec per loop