我有一个元素列表,它们应该是唯一的构造。我的意思是,列表中不会出现任何元素。
我想有效地测试该列表中是否存在某个项目,以及许多项目中的项目。
如果我将列表转换为集合,测试会更有效。
现在我的问题是关于如何有效地构建集合。
我想当我做my_set = set(my_list)
时,python不得不以逐步构造集合的方式测试列表中项目的成员资格。
鉴于我知道该列表不包含重复内容,这是次优的吗?
有可能做得更好吗?
上述问题的答案是否会改变,如果不是列表,我有一个迭代器(我仍然知道它将产生的项目是唯一的)?
答案 0 :(得分:3)
Python在构造集合时不进行显式成员资格测试。它不需要;集合的性质是唯一的,即成员按其哈希值编制索引。因此,在构造集合时,所有Python都依次散列每个元素,然后将其插入适当的位置。
Python docs on time complexity没有明确列出集合构造,但他们确实说大多数操作与dict相同,并且插入dict是O(1),我们可以假设该集合建筑是O(n)。
答案 1 :(得分:1)
由于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