从唯一元素列表中高效构建 python 集
Efficiently build a python set from a list of unique elements
我有一个元素列表,这些元素在构造上应该是唯一的。我的意思是,没有元素会在列表中多次出现。
我想有效地测试某个项目是否存在于该列表中,并且这适用于许多项目。
如果我将列表转换成集合,测试会更有效率。
现在我的问题是关于如何有效地构建集合。
我想当我做 my_set = set(my_list)
时,python 必须以某种方式测试列表中项目的成员资格,因为它会逐步构建集合。
鉴于我知道该列表不包含重复项,这是次优的吗?
是否可以做得更好?
如果我有一个迭代器而不是列表,上述问题的答案是否会改变(关于它我仍然知道它将产生的项目将是唯一的)?
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
我有一个元素列表,这些元素在构造上应该是唯一的。我的意思是,没有元素会在列表中多次出现。
我想有效地测试某个项目是否存在于该列表中,并且这适用于许多项目。
如果我将列表转换成集合,测试会更有效率。
现在我的问题是关于如何有效地构建集合。
我想当我做 my_set = set(my_list)
时,python 必须以某种方式测试列表中项目的成员资格,因为它会逐步构建集合。
鉴于我知道该列表不包含重复项,这是次优的吗?
是否可以做得更好?
如果我有一个迭代器而不是列表,上述问题的答案是否会改变(关于它我仍然知道它将产生的项目将是唯一的)?
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