r58895 - in python/trunk: Lib/test/test_dict.py Objects/dictobject.c
![](https://secure.gravatar.com/avatar/8ac615df352a970211b0e3d94a307c6d.jpg?s=120&d=mm&r=g)
Author: raymond.hettinger Date: Wed Nov 7 03:26:17 2007 New Revision: 58895 Modified: python/trunk/Lib/test/test_dict.py python/trunk/Objects/dictobject.c Log: Optimize dict.fromkeys() with dict inputs. Useful for resetting bag/muliset counts for example. Modified: python/trunk/Lib/test/test_dict.py ============================================================================== --- python/trunk/Lib/test/test_dict.py (original) +++ python/trunk/Lib/test/test_dict.py Wed Nov 7 03:26:17 2007 @@ -243,6 +243,10 @@ self.assertRaises(Exc, baddict2.fromkeys, [1]) + # test fast path for dictionary inputs + d = dict(zip(range(6), range(6))) + self.assertEqual(dict.fromkeys(d, 0), dict(zip(range(6), [0]*6))) + def test_copy(self): d = {1:1, 2:2, 3:3} self.assertEqual(d.copy(), {1:1, 2:2, 3:3}) Modified: python/trunk/Objects/dictobject.c ============================================================================== --- python/trunk/Objects/dictobject.c (original) +++ python/trunk/Objects/dictobject.c Wed Nov 7 03:26:17 2007 @@ -1184,6 +1184,25 @@ if (d == NULL) return NULL; + if (PyDict_CheckExact(d) && PyDict_CheckExact(seq)) { + PyDictObject *mp = (PyDictObject *)d; + PyObject *oldvalue; + Py_ssize_t pos = 0; + PyObject *key; + long hash; + + if (dictresize(mp, ((PyDictObject *)seq)->ma_used)) + return NULL; + + while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) { + Py_INCREF(key); + Py_INCREF(value); + if (insertdict(mp, key, hash, value)) + return NULL; + } + return d; + } + if (PyDict_CheckExact(d) && PyAnySet_CheckExact(seq)) { PyDictObject *mp = (PyDictObject *)d; Py_ssize_t pos = 0;
participants (1)
-
raymond.hettinger