Mercurial > hg
changeset 18847:40c679748fa9
dicthelpers: inline diff and join code
mpm suggested this change since it improves performance slightly.
Benchmarking hg perfcalculate -r .
Before:
! wall 0.141173 comb 0.140000 user 0.140000 sys 0.000000 (best of 66)
After:
! wall 0.138619 comb 0.140000 user 0.140000 sys 0.000000 (best of 69)
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Fri, 29 Mar 2013 16:07:57 -0700 |
parents | 860d36b763ae |
children | cc741817a49e |
files | mercurial/dicthelpers.py |
diffstat | 1 files changed, 29 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/dicthelpers.py Fri Mar 29 15:23:19 2013 -0700 +++ b/mercurial/dicthelpers.py Fri Mar 29 16:07:57 2013 -0700 @@ -5,20 +5,46 @@ # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. -def _diffjoin(d1, d2, default, compare): +def diff(d1, d2, default=None): + '''Return all key-value pairs that are different between d1 and d2. + + This includes keys that are present in one dict but not the other, and + keys whose values are different. The return value is a dict with values + being pairs of values from d1 and d2 respectively, and missing values + represented as default.''' res = {} - if d1 is d2 and compare: + if d1 is d2: # same dict, so diff is empty return res for k1, v1 in d1.iteritems(): if k1 in d2: v2 = d2[k1] - if not compare or v1 != v2: + if v1 != v2: res[k1] = (v1, v2) else: res[k1] = (v1, default) + for k2 in d2: + if k2 not in d1: + res[k2] = (default, d2[k2]) + + return res + +def join(d1, d2, default=None): + '''Return all key-value pairs from both d1 and d2. + + This is akin to an outer join in relational algebra. The return value is a + dict with values being pairs of values from d1 and d2 respectively, and + missing values represented as default.''' + res = {} + + for k1, v1 in d1.iteritems(): + if k1 in d2: + res[k1] = (v1, d2[k1]) + else: + res[k1] = (v1, default) + if d1 is d2: return res @@ -27,20 +53,3 @@ res[k2] = (default, d2[k2]) return res - -def diff(d1, d2, default=None): - '''Return all key-value pairs that are different between d1 and d2. - - This includes keys that are present in one dict but not the other, and - keys whose values are different. The return value is a dict with values - being pairs of values from d1 and d2 respectively, and missing values - represented as default.''' - return _diffjoin(d1, d2, default, True) - -def join(d1, d2, default=None): - '''Return all key-value pairs from both d1 and d2. - - This is akin to an outer join in relational algebra. The return value is a - dict with values being pairs of values from d1 and d2 respectively, and - missing values represented as default.''' - return _diffjoin(d1, d2, default, False)