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)
--- 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)