# Evaluate speed for dict.get() vs dict_subclass.__missing__ # Test cases where the entry already exists and cases where it is missing. setup_empty = ''' from random import randrange, seed class A(dict): def __missing__(self, key): return 0 seed('xyzpdgtoday') data = list(randrange(100000) for i in range(1000)) a = A() d = {} d_get = d.get ''' stmts_emtpy = [ 'for k in data: a[k] + 1', 'for k in data: d_get(k, 0) + 1', ] setup_full = setup_empty + ''' d_getitem = d.__getitem__ a.update((k,k) for k in data) d.update((k,k) for k in data) ''' stmts_full = stmts_emtpy + [ 'for k in data: d_getitem(k) + 1', ] from timeit import Timer for i in range(3): print('Unpopulated dict') for stmt in stmts_emtpy: print(min(Timer(stmt, setup_empty).repeat(7, 1000)), stmt) print() print('Fully pre-populated dict') for stmt in stmts_full: print(min(Timer(stmt, setup_full).repeat(7, 1000)), stmt) print() print()