Ответ 1
Путь D.get()
включает в себя поиск атрибута и вызов метода:
>>> import dis
>>> D = {"a": 1, "b": 2, "c": 3}
>>> def gt(): return D.get('a', 1)
...
>>> dis.dis(gt)
1 0 LOAD_GLOBAL 0 (D)
3 LOAD_ATTR 1 (get)
6 LOAD_CONST 1 ('a')
9 LOAD_CONST 2 (1)
12 CALL_FUNCTION 2
15 RETURN_VALUE
Поиск атрибута (LOAD_ATTR
) особенно замедляет работу.
Если вы удалите поиск атрибута (и дайте тесту in
локальное работать), поле будет выровнено:
>>> def gt_fast(D_get=D.get): return D_get('a', 1)
...
>>> def ef_fast(D=D): return D['a'] if 'a' in D else 1
...
>>> timeit.timeit(gt_fast)
0.2174091339111328
>>> timeit.timeit(ef_fast)
0.2139298915863037