简体   繁体   中英

Why is “in” operation in Python faster than iterating a list?

For example, I want to determine if a certain number a is in a list A. If I use return a in A , this would be much faster than writing an iteration function like

for number in A: 
    if a == number:
        return True

What's under the hood? Is Python using a different way as mine to determine the membership? I skimmed the Python documentation but didn't find the answer.

6.10.2. Membership test operations

For container types such as list, tuple, set, frozenset, dict, or collections.deque, the expression x in y is equivalent to any(x is e or x == e for e in y) .

For the string and bytes types, x in y is True if and only if x is a substring of y. An equivalent test is y.find(x) != -1 . Empty strings are always considered to be a substring of any other string, so "" in "abc" will return True .

For user-defined classes which define the __contains__() method, x in y returns True if y.__contains__(x) returns a true value, and False otherwise.

For user-defined classes which do not define __contains__() but do define __iter__() , x in y is True if some value z with x == z is produced while iterating over y . If an exception is raised during the iteration, it is as if in raised that exception.

Lastly, the old-style iteration protocol is tried: if a class defines __getitem__() , x in y is True if and only if there is a non-negative integer index i such that x == y[i] , and all lower integer indices do not raise IndexError exception. (If any other exception is raised, it is as if in raised that exception).

Information extracted from the Python official page: https://docs.python.org/3/reference/expressions.html

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM