Вот точные временные результаты с Python 2.7:
>>> %timeit (3, 8) in d.keys() # Slow, indeed
100000 loops, best of 3: 9.58 us per loop
>>> %timeit 8 in t[3].keys() # Faster
1000000 loops, best of 3: 246 ns per loop
>>> %timeit (3, 8) in d # Even faster!
10000000 loops, best of 3: 117 ns per loop
>>> %timeit 8 in t[3] # Slightly slower
10000000 loops, best of 3: 127 ns per loop
Они показывают, что стандартный (3, 8) in d
(без .keys()
построения списка) на самом деле чуть быстрее (менее общего) подхода 8 in t[3]
, и в два раза быстрее по сравнению с относительно быстрым 8 in t[3].keys()
вопроса. Это .keys
/ no .keys
отличие связано с тем, что (3, 8) in d.keys()
создает список (в Python 2) ключей, а затем ищет в этом списке (3, 8)
, что намного медленнее, чем поиск (3, 8)
в хеш-таблице словаря d
.
Как отмечается в комментариях, результаты синхронизации отличаются в Python 3: keys()
в Python 3 имеет быстрый in
тест, поскольку вместо keys()
возвращается представление о ключах, так что оператор in
может используйте хеш-таблицу соответствующего словаря.
Разница в скорости в исходном вопросе проистекает из того факта, что d.keys()
создает относительно длинный список по сравнению с t[3].keys()
.
PS: функция %timeit
обеспечивается превосходной оболочкой IPython . Оригинальная программа может быть выполнена через IPython с %run prog.py
.