为什么any()比in这么快?

时间:2019-03-12 23:52:19

标签: python performance

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 个答案:

答案 0 :(得分:3)

正如一些人在评论中指出的那样,执行in测试的函数比使用any的版本慢的原因是因为该函数包括不必要的列表需要在in运算符可以开始寻找匹配之前迭代整个输入的理解。在列表上运行时,inany都可能短路,如果在搜索的早期找到匹配的值,则提前退出。但是,即使开始时有1,第二个函数中的列表理解也始终会遍历整个输入。

如果将1 in [num for num in input]替换为1 in input,您会发现性能比使用any的功能好或更好。如果input是一个列表,性能将非常相似,但是对于其他容器类型(例如setrange s)可能会更快。