从一系列独特元素中有效地构建一个python集

时间:2015-03-26 18:49:40

标签: python performance list iterator set

我有一个元素列表,它们应该是唯一的构造。我的意思是,列表中不会出现任何元素。

我想有效地测试该列表中是否存在某个项目,以及许多项目中的项目。

如果我将列表转换为集合,测试会更有效。

现在我的问题是关于如何有效地构建集合。

我想当我做my_set = set(my_list)时,python不得不以逐步构造集合的方式测试列表中项目的成员资格。

  1. 鉴于我知道该列表不包含重复内容,这是次优的吗?

  2. 有可能做得更好吗?

  3. 上述问题的答案是否会改变,如果不是列表,我有一个迭代器(我仍然知道它将产生的项目是唯一的)?

2 个答案:

答案 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