Skip to content

Instantly share code, notes, and snippets.

@bnorick
Forked from treyhunner/time_dict_merge.py
Last active January 22, 2020 15:03
Show Gist options
  • Save bnorick/adfe68808916621d369e to your computer and use it in GitHub Desktop.
Save bnorick/adfe68808916621d369e to your computer and use it in GitHub Desktop.
Test performance of different dictionary merging functions in Python
"""
Results:
multiple_update: 56 ms
copy_and_update: 48 ms
dict_constructor: 56 ms
kwargs_hack: 44 ms
dict_comprehension: 97 ms
concatenate_items: 196 ms
union_items: 168 ms
chain_items: 135 ms
chainmap: 104 ms
dict_from_chainmap: 587 ms
dict_unpacking: 29 ms
"""
import timeit
setup = """
from collections import ChainMap
from itertools import chain
def multiple_update(dict_a, dict_b):
merged = {}
merged.update(dict_a)
merged.update(dict_b)
return merged
def copy_and_update(dict_a, dict_b):
merged = dict_a.copy()
merged.update(dict_b)
return merged
def dict_constructor(dict_a, dict_b):
merged = dict(dict_a)
merged.update(dict_b)
return merged
def kwargs_hack(dict_a, dict_b):
return dict(dict_a, **dict_b)
def dict_comprehension(dict_a, dict_b):
return {k: v for d in [dict_a, dict_b] for k,v in d.items()}
def concatenate_items(dict_a, dict_b):
return dict(list(dict_a.items()) + list(dict_b.items()))
def union_items(dict_a, dict_b):
return dict(dict_a.items() | dict_b.items())
def chain_items(dict_a, dict_b):
return dict(chain(dict_a.items(), dict_b.items()))
def chainmap(dict_a, dict_b):
return ChainMap({}, dict_b, dict_a)
def dict_from_chainmap(dict_a, dict_b):
return dict(ChainMap(dict_b, dict_a))
def dict_unpacking(dict_a, dict_b):
return {**dict_a, **dict_b}
defaults = {'name': "Anonymous User", 'page_name': "Profile Page"}
user = {'name': "Trey", 'website': "http://treyhunner.com"}
"""
def time_function(func_name):
timed_code = "context = {}(defaults, user)".format(func_name).strip()
time = min(timeit.Timer(timed_code, setup=setup).repeat(7, 100000))
print("{}: {} ms".format(func_name, int(time * 1000)))
time_function("multiple_update")
time_function("copy_and_update")
time_function("dict_constructor")
time_function("kwargs_hack")
time_function("dict_comprehension")
time_function("concatenate_items")
time_function("union_items")
time_function("chain_items")
time_function("chainmap")
time_function("dict_from_chainmap")
time_function("dict_unpacking")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment