代码之家  ›  专栏  ›  技术社区  ›  Mantas Vidutis

python集vs列表

  •  152
  • Mantas Vidutis  · 技术社区  · 16 年前

    在Python中,哪种数据结构更高效/更快?假设这个顺序对我来说并不重要,并且无论如何我都要检查重复项,那么Python设置是否比Python列表慢?

    5 回复  |  直到 7 年前
        1
  •  183
  •   smerlin    10 年前

    这取决于你打算用它做什么。

    当确定对象是否存在于集合中时,集合速度明显更快(如 x in s ,但在迭代其内容时比列表慢。

    你可以使用 timeit module 看看哪一个更适合你的情况。

        2
  •  125
  •   Ellis Percival    7 年前

    当您只想遍历值时,列表比集合稍快。

    但是,如果要检查项是否包含在列表中,则集合比列表快得多。但它们只能包含唯一的项。

    事实证明,元组的执行方式与列表几乎完全相同,除了它们的不变性。

    迭代

    >>> def iter_test(iterable):
    ...     for i in iterable:
    ...         pass
    ...
    >>> from timeit import timeit
    >>> timeit(
    ...     "iter_test(iterable)",
    ...     setup="from __main__ import iter_test; iterable = set(range(10000))",
    ...     number=100000)
    12.666952133178711
    >>> timeit(
    ...     "iter_test(iterable)",
    ...     setup="from __main__ import iter_test; iterable = list(range(10000))",
    ...     number=100000)
    9.917098999023438
    >>> timeit(
    ...     "iter_test(iterable)",
    ...     setup="from __main__ import iter_test; iterable = tuple(range(10000))",
    ...     number=100000)
    9.865639209747314
    

    确定对象是否存在

    >>> def in_test(iterable):
    ...     for i in range(1000):
    ...         if i in iterable:
    ...             pass
    ...
    >>> from timeit import timeit
    >>> timeit(
    ...     "in_test(iterable)",
    ...     setup="from __main__ import in_test; iterable = set(range(1000))",
    ...     number=10000)
    0.5591847896575928
    >>> timeit(
    ...     "in_test(iterable)",
    ...     setup="from __main__ import in_test; iterable = list(range(1000))",
    ...     number=10000)
    50.18339991569519
    >>> timeit(
    ...     "in_test(iterable)",
    ...     setup="from __main__ import in_test; iterable = tuple(range(1000))",
    ...     number=10000)
    51.597304821014404
    
        3
  •  7
  •   user2601995    13 年前

    列表性能:

    >>> import timeit
    >>> timeit.timeit(stmt='10**6 in a', setup='a = range(10**6)', number=100000)
    0.008128150348026608
    

    设置性能:

    >>> timeit.timeit(stmt='10**6 in a', setup='a = set(range(10**6))', number=100000)
    0.005674857488571661
    

    你可能想考虑 多元组 因为它们与列表类似,但不能修改。它们占用更少的内存,访问速度更快。它们没有那么灵活,但比列表更有效。它们通常用作字典键。

    集合也是序列结构,但与列表和元组有两个区别。尽管集合确实有一个顺序,但该顺序是任意的,不受程序员的控制。第二个区别是集合中的元素必须是唯一的。

    set 根据定义。[ python γ wiki ]

    >>> x = set([1, 1, 2, 2, 3, 3])
    >>> x
    {1, 2, 3}
    
        4
  •  4
  •   Christophe Roussy    9 年前

    Set 由于近即时“包含”检查而获胜: https://en.wikipedia.org/wiki/Hash_table

    表 实现:通常是一个数组,级别较低,靠近金属,便于迭代和按元素索引随机访问。

    集合 实施: https://en.wikipedia.org/wiki/hash_表 ,它不在列表上迭代,而是通过计算 搞砸 从键开始,所以它取决于键元素的性质和哈希函数。类似于口述。我怀疑 list 如果元素很少(<5),则速度可能更快,元素数量越大, set 将执行包含检查。对元素的添加和去除也很快。

    注释 如果 列表 已排序,正在搜索 列表 可能很快,但通常情况下 设置 对于包含检查更快更简单。

        5
  •  0
  •   Aditya Roy    8 年前

    我建议在用例被限制为引用或搜索存在的情况下使用集合实现,在用例要求您执行迭代的情况下使用元组实现。列表是一种低级实现,需要大量的内存开销。