Почему any () намного быстрее, чем в? - PullRequest
2 голосов
/ 13 марта 2019

https://repl.it/@ArmanTavakoli/List-Comprehension-vs-Any

Почему моя any проверка намного быстрее, чем моя in проверка, когда они по существу делают то же самое?

from timeit import default_timer as timer
import random

input = [random.randint(0, 100) for x in range(0, 1000000)]

def any_check(input):
  return any(i == 1 for i in input)

def list_comprehension(input):
  return 1 in [num for num in input]

first_start = timer()
any_check(input)
first_end = timer()
print('any_check', first_end - first_start)

second_start = timer()
list_comprehension(input)
second_end = timer()
print('list_comprehension', second_end - second_start)

Результаты выполненияфункционирует 3 раза каждый.

# Calculated with 3 runs each
# Ratio is list_comprehension:any_check

# 10,000 - Mean Ratio: 17.87
# Example run;
# any_check 1.5022000297904015e-05
# list_comprehension 0.00038980199315119535

# 100,000 - Mean Ratio: 140.76
# any_check 2.020499960053712e-05
# list_comprehension 0.0035961729954578914

# 1,000,000 - Mean Ratio: 3379.81
# any_check 2.2904998331796378e-05
# list_comprehension 0.08528400499926647

1 Ответ

3 голосов
/ 13 марта 2019

Как отметили несколько человек в комментариях, причина, по которой ваша функция, выполняющая тест in, медленнее, чем версия, использующая any, заключается в том, что эта функция также включает в себя ненужное понимание списка, которое необходимо повторить по всему вводу, прежде чем оператор in сможет начать поиск совпадения. При запуске по спискам, и in, и any могут замкнуть накоротко, выходя раньше, если в начале поиска найдено соответствующее значение. Но понимание списка в вашей второй функции всегда перебирает весь ввод, даже если в самом начале было 1.

Если вы замените 1 in [num for num in input] на 1 in input, вы увидите, что производительность будет лучше или лучше, чем в вашей функции, использующей any. Производительность была бы довольно схожей, если бы input был списком, но могла бы быть намного быстрее для других типов контейнеров (таких как set s и range s).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...