Почему операция «in» в Python быстрее, чем перебор списка? - PullRequest
0 голосов
/ 02 декабря 2018

Например, я хочу определить, есть ли определенное число a в списке A. Если я использую return a in A, это будет намного быстрее, чем написание итерационной функции, такой как

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

Что находится подкапот?Использует ли Python другой способ определения членства?Я просмотрел документацию Python , но не нашел ответа.

1 Ответ

0 голосов
/ 03 декабря 2018

6.10.2.Операции тестирования членства

Для типов контейнеров, таких как список, кортеж, набор, frozenset, dict или collection.deque, выражение x in y эквивалентно any(x is e or x == e for e in y).

Для строковых и байтовых типов x in y равно True тогда и только тогда, когда x является подстрокой y.Эквивалентный тест - y.find(x) != -1.Пустые строки всегда считаются подстрокой любой другой строки, поэтому "" in "abc" вернет True.

Для пользовательских классов, которые определяют метод __contains__(), x in y возвращает Trueесли y.__contains__(x) возвращает истинное значение, а False в противном случае.

Для пользовательских классов, которые не определяют __contains__(), но определяют __iter__(), x in y равно True, если какое-либо значениеz с x == z создается при итерации по y.Если во время итерации возникает исключение, это как если бы in вызывало это исключение.

Наконец, используется итерационный протокол старого стиля: если класс определяет __getitem__(), x in y равен True тогда и только тогда, когда существует неотрицательный целочисленный индекс i такой, что x == y[i], и все нижние целочисленные индексы не вызывают исключение IndexError.(Если возникает любое другое исключение, это как если бы возникло это исключение).

Информация, извлеченная с официальной страницы Python: https://docs.python.org/3/reference/expressions.html

...