summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2012-12-02 18:10:07 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2012-12-02 18:10:07 (GMT)
commit0e9958b543686ccd39d7fceb7de2ac84fff83834 (patch)
tree3e4211729f461d70af6419aa81fb41d2f72d9e67
parent181e20a6fc178f97741eef1176f660ad5447ea8b (diff)
downloadcpython-0e9958b543686ccd39d7fceb7de2ac84fff83834.zip
cpython-0e9958b543686ccd39d7fceb7de2ac84fff83834.tar.gz
cpython-0e9958b543686ccd39d7fceb7de2ac84fff83834.tar.bz2
Issue #16562: Optimize dict equality testing.
Patch by Serhiy Storchaka (reviewed by Martin and Raymond).
-rw-r--r--Misc/NEWS2
-rw-r--r--Objects/dictobject.c7
2 files changed, 8 insertions, 1 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index b37a3c7..f663544 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,8 @@ What's New in Python 3.4.0 Alpha 1?
Core and Builtins
-----------------
+- Issue #16562: Optimize dict equality testing. Patch by Serhiy Storchaka.
+
- Issue #16588: Silence unused-but-set warnings in Python/thread_pthread
- Issue #16592: stringlib_bytes_join doesn't raise MemoryError on allocation
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index f4ad3dc..a3c6409 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -2114,13 +2114,18 @@ dict_equal(PyDictObject *a, PyDictObject *b)
if (aval != NULL) {
int cmp;
PyObject *bval;
+ PyObject **vaddr;
PyObject *key = ep->me_key;
/* temporarily bump aval's refcount to ensure it stays
alive until we're done with it */
Py_INCREF(aval);
/* ditto for key */
Py_INCREF(key);
- bval = PyDict_GetItemWithError((PyObject *)b, key);
+ /* reuse the known hash value */
+ if ((b->ma_keys->dk_lookup)(b, key, ep->me_hash, &vaddr) == NULL)
+ bval = NULL;
+ else
+ bval = *vaddr;
Py_DECREF(key);
if (bval == NULL) {
Py_DECREF(aval);