I was doing some experimentation about operations' speed on list. For this I defined two list: l_short = [] and l_long = list(range(10**7)).
The idea is to compare bool(l) with len(l) != 0
In an if contest, the following implementation is faster by a lot if l: pass instead of if len(l) != 0: pass
But without the if contest I got the following results:
%%timeit
len(l_long) != 0
# 59.8 ns ± 0.358 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%%timeit
bool(l_long)
# 63.3 ns ± 0.192 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
The timing of bool is slightly longer, why so ?
Here are the bytecodes using dis (FYI)
dis("len(l_long) != 0")
"""
1 0 LOAD_NAME 0 (len)
2 LOAD_NAME 1 (l_long)
4 CALL_FUNCTION 1
6 LOAD_CONST 0 (0)
8 COMPARE_OP 3 (!=)
10 RETURN_VALUE
"""
dis("bool(l_long)")
"""
1 0 LOAD_NAME 0 (bool)
2 LOAD_NAME 1 (l_long)
4 CALL_FUNCTION 1
6 RETURN_VALUE
"""
bool(l_long) first tries to call l_long.__bool_(); however, list.__bool__ isn't defined. The next step is to call l_long.__len__() != 0.
len(l_long) != 0, on the other hand, goes straight to l_long.__len__()
The time difference you see is essentially the time it takes to catch the AttributeError raised by l_long.__bool__ before calling l_long.__len__ anyway.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With