This came up in a nitpick discussion about the prefered style for iterating over dictionary keys if you need to apply some test to the value. I was comparing the performance of [k for k in d if d[k] == 1]
against [k for k, v in d.items() if v == 1]
.
Looks like dictionary lookups are more expensive in Python 3.4:
$ python -m timeit -n 1000000 \
-s 'd={k:v for v, k in enumerate("abcdefghijhklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")}' \
'[k for k in d if d[k] == 1]'
1000000 loops, best of 3: 2.17 usec per loop
$ python -m timeit -n 1000000 \
-s 'd={k:v for v, k in enumerate("abcdefghijhklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")}' \
'[k for k, v in d.items() if v == 1]'
1000000 loops, best of 3: 3.13 usec per loop
$ python3.4 -m timeit -n 1000000 \
-s 'd={k:v for v, k in enumerate("abcdefghijhklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")}' \
'[k for k in d if d[k] == 1]'
1000000 loops, best of 3: 3.25 usec per loop
$ python3.4 -m timeit -n 1000000 \
-s 'd={k:v for v, k in enumerate("abcdefghijhklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")}' \
'[k for k, v in d.items() if v == 1]'
1000000 loops, best of 3: 3.05 usec per loop
Are lookups more expensive in Python 3.4 compared to 2.7 and can you explain why?