简体   繁体   中英

The speed difference of two generators in any (built in function)

In this code, why is the second output faster than the first!?

Both do almost the same thing and have the same result.


from timeit import timeit

lst = [0] * 10000000

txt1 = "any(i % 2 for i in lst)"
txt2 = "any(True for i in lst if i % 2)"

print(timeit(txt1, globals=globals(), number=2))
print(timeit(txt2, globals=globals(), number=2))

result:

Time : 2.112963530991692
Time : 0.9412867689970881

like @sj95126 said in the comments: the first produces 10000000 values for any() to check, the second generator produces 0 values

you can check it by calling list on it instead of any, in a more smaller sample of course

>>> lst = [0]*10
>>> any(i % 2 for i in lst)
False
>>> list(i % 2 for i in lst)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> any(True for i in lst if i % 2)
False
>>> list(True for i in lst if i % 2)
[]
>>> 

The reason is due to what each generator produces. The first generator produces 10000000 False values. The second generator produces nothing, because i % 2 will never be non-zero.

You can see a similar difference by removing the generator and the list creation from the timings:

>>> x = []
>>> y = [0] * 10000000
>>> timeit("any(x)", globals=globals(), number=2)
3.900029696524143e-06
>>> timeit("any(y)", globals=globals(), number=2)
0.12017650000052527

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-2025 STACKOOM.COM