-
-
Save bnorick/adfe68808916621d369e to your computer and use it in GitHub Desktop.
Test performance of different dictionary merging functions in Python
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
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