从唯一元素列表中高效构建 python 集

Efficiently build a python set from a list of unique elements

我有一个元素列表,这些元素在构造上应该是唯一的。我的意思是,没有元素会在列表中多次出现。

我想有效地测试某个项目是否存在于该列表中,并且这适用于许多项目。

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

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

我想当我做 my_set = set(my_list) 时,python 必须以某种方式测试列表中项目的成员资格,因为它会逐步构建集合。

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

  2. 是否可以做得更好?

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

Python 在构造集合时不进行显式成员测试。它不需要;集合在本质上是唯一的,即成员由它们的哈希值索引。所以在构造一个集合时,Python所做的就是依次散列每个元素,然后将其插入适当的位置。

Python docs on time complexity没有明确列出集合构造,但他们确实说大多数操作与dict相同,并且插入dict是O(1),由此我们可以假设集合构造是 O(n)。

由于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