Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is any (True for ... if cond) much faster than any (cond for ...)?

Two similar ways to check whether a list contains an odd number:

any(x % 2 for x in a) any(True for x in a if x % 2) 

Timing results with a = [0] * 10000000 (five attempts each, times in seconds):

0.60  0.60  0.60  0.61  0.63  any(x % 2 for x in a) 0.36  0.36  0.36  0.37  0.37  any(True for x in a if x % 2) 

Why is the second way almost twice as fast?

My testing code:

from timeit import repeat  setup = 'a = [0] * 10000000'  expressions = [     'any(x % 2 for x in a)',     'any(True for x in a if x % 2)', ]  for expression in expressions:     times = sorted(repeat(expression, setup, number=1))     print(*('%.2f ' % t for t in times), expression) 

Try it online!

like image 421
no comment Avatar asked Aug 26 '21 12:08

no comment


1 Answers

The first method sends everything to any() whilst the second only sends to any() when there's an odd number, so any() has fewer elements to go through.

like image 107
Adrien Levert Avatar answered Nov 11 '22 07:11

Adrien Levert