Skip to content

Instantly share code, notes, and snippets.

Created May 10, 2012 08:25
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/2651872 to your computer and use it in GitHub Desktop.
Save anonymous/2651872 to your computer and use it in GitHub Desktop.
def equal_dicts_1(a, b, ignore_keys):
ka = set(a).difference(ignore_keys)
kb = set(b).difference(ignore_keys)
return ka == kb and all(a[k] == b[k] for k in ka)
def equal_dicts_2(d1, d2, ignore_keys):
d1_filtered = dict((k, v) for k,v in d1.iteritems() if k not in ignore_keys)
d2_filtered = dict((k, v) for k,v in d2.iteritems() if k not in ignore_keys)
return d1_filtered == d2_filtered
def equal_dicts_3(d1, d2, ignore_keys):
ignored = set(ignore_keys)
for k1, v1 in d1.iteritems():
if k1 not in ignored and (k1 not in d2 or d2[k1] != v1):
return False
for k2, v2 in d2.iteritems():
if k2 not in ignored and k2 not in d1:
return False
return True
def equal_dicts_4(d1, d2, ignore_keys):
ignore = set(ignore_keys)
for k in d1:
if k in ignore_keys:
continue
try:
if d1[k] != d2[k]:
return False
except KeyError:
return False
for k in d2:
if k in ignore_keys:
continue
try:
if d1[k] != d2[k]:
return False
except KeyError:
return False
return True
def equal_dicts_5(d1, d2, ignore_keys):
return {k: v for k,v in d1.iteritems() if k not in ignore_keys} == {k: v for k,v in d2.iteritems() if k not in ignore_keys}
setup = """
a = {chr(c):c for c in range(255)}
b = {chr(c):c for c in range(255)}
"""
import timeit
results = []
for k, v in locals().items():
if callable(v):
imp = 'from __main__ import ' + k + '\n'
t = timeit.timeit(k + '(a,b,["foo"])', imp + setup, number=1000)
results.append((t, k))
for p in sorted(results):
print '%.4f %s' % p
#0.0897 equal_dicts_1
#0.1225 equal_dicts_5
#0.1309 equal_dicts_4
#0.1489 equal_dicts_3
#0.1689 equal_dicts_2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment