Which is faster and why? Set or List?

前端 未结 3 2014
误落风尘
误落风尘 2020-11-30 10:09

Lets say that I have a graph and want to see if b in N[a]. Which is the faster implementation and why?

a, b = range(2)
N = [set([b]), set([a,b])         


        
相关标签:
3条回答
  • 2020-11-30 10:23

    It all depends on what you're trying to accomplish. Using your example verbatim, it's faster to use lists, as you don't have to go through the overhead of creating the sets:

    import timeit
    
    def use_sets(a, b):
        return [set([b]), set([a, b])]
    
    def use_lists(a, b):
        return [[b], [a, b]]
    
    t=timeit.Timer("use_sets(a, b)", """from __main__ import use_sets
    a, b = range(2)""")
    print "use_sets()", t.timeit(number=1000000)
    
    t=timeit.Timer("use_lists(a, b)", """from __main__ import use_lists
    a, b = range(2)""")
    print "use_lists()", t.timeit(number=1000000)
    

    Produces:

    use_sets() 1.57522511482
    use_lists() 0.783344984055
    

    However, for reasons already mentioned here, you benefit from using sets when you are searching large sets. It's impossible to tell by your example where that inflection point is for you and whether or not you'll see the benefit.

    I suggest you test it both ways and go with whatever is faster for your specific use-case.

    0 讨论(0)
  • 2020-11-30 10:26

    Set ( I mean a hash based set like HashSet) is much faster than List to lookup for a value. List has to go sequentially to find out if the value exists. HashSet can directly jump and locate the bucket and look up for a value almost in a constant time.

    0 讨论(0)
  • 2020-11-30 10:31

    Membership testing in a set is vastly faster, especially for large sets. That is because the set uses a hash function to map to a bucket. Since Python implementations automatically resize that hash table, the speed can be constant (O(1)) no matter the size of the set (assuming the hash function is sufficiently good).

    In contrast, to evaluate whether an object is a member of a list, Python has to compare every single member for equality, i.e. the test is O(n).

    0 讨论(0)
提交回复
热议问题