Bill wrote: > Robin Becker wrote: >> On 16/09/2017 01:58, Steve D'Aprano wrote: >> ........ >>> >>> If you want to test for None specifically: >>> >>> if any(v is None for v in values): >>> print "at least one value was None" >>> >> ....... >> >> for some reason that seems slow on my machine when compared with >> >> if None in values: >> ..... >> >> > This does not seem particularly surprising. "None in values" is known > as soon as None is found. > In "any(v is None for v in values)", "any" probably isn't called until > its argument is (fully) known. Of course the results would depend on > the implementation. It would be interesting to compare the results if > you used the optimize option (it's either -o or -O). > > Bill
I don't think that optimisation can do much here, but there's another aspect that has a realistic chance to affect the result: None in values checks equality, and that may be slower than comparing identities: $ python3 -m timeit -s"from slow_eq import A; values = 1, 2, A()" "any(v is None for v in values)" 1000000 loops, best of 3: 1.1 usec per loop $ python3 -m timeit -s"from slow_eq import A; values = 1, 2, A()" "None in values" 10 loops, best of 3: 1 sec per loop That's of course an extreme example that I wilfully constructed: $ cat slow_eq.py import time class A: def __eq__(self, other): time.sleep(1) return NotImplemented >>> C:\usr\share\robin\pythonDoc>python -m timeit -s"values=(1,2,None)" >>> "any(v is None for v in values)" >>> 1000000 loops, best of 3: 0.62 usec per loop >>> >>> C:\usr\share\robin\pythonDoc>python -m timeit >>> -s"values=(None,2,None)" "any(v is None for v in values)" >>> 1000000 loops, best of 3: 0.504 usec per loop >>> >>> C:\usr\share\robin\pythonDoc>python -m timeit >>> -s"values=(None,2,None)" "None in values" >>> 10000000 loops, best of 3: 0.0309 usec per loop >>> >>> C:\usr\share\robin\pythonDoc>python -m timeit -s"values=(1,2,None)" >>> "None in values" >>> 10000000 loops, best of 3: 0.097 usec per loop >> >> it also seems a bit less obvious -- https://mail.python.org/mailman/listinfo/python-list