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
答案 0 :(得分:3)
正如一些人在评论中指出的那样,执行in
测试的函数比使用any
的版本慢的原因是因为该函数还包括不必要的列表需要在in
运算符可以开始寻找匹配之前迭代整个输入的理解。在列表上运行时,in
和any
都可能短路,如果在搜索的早期找到匹配的值,则提前退出。但是,即使开始时有1
,第二个函数中的列表理解也始终会遍历整个输入。
如果将1 in [num for num in input]
替换为1 in input
,您会发现性能比使用any
的功能好或更好。如果input
是一个列表,性能将非常相似,但是对于其他容器类型(例如set
和range
s)可能会更快。