summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2007-11-09 23:14:44 (GMT)
committerRaymond Hettinger <python@rcn.com>2007-11-09 23:14:44 (GMT)
commit34448790db8ce27eee5a72f7175c47cd4a8f8940 (patch)
treefca2d4b7a0bbb5df06c8212fde9de3fb59619fff
parentd3d0baf0a1062686a04aaeedc4dbdb879b32c200 (diff)
downloadcpython-34448790db8ce27eee5a72f7175c47cd4a8f8940.zip
cpython-34448790db8ce27eee5a72f7175c47cd4a8f8940.tar.gz
cpython-34448790db8ce27eee5a72f7175c47cd4a8f8940.tar.bz2
Optimize common case for dict.fromkeys().
-rw-r--r--Objects/dictobject.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 00f9bc8..978071b 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -1191,7 +1191,7 @@ dict_fromkeys(PyObject *cls, PyObject *args)
PyObject *key;
long hash;
- if (dictresize(mp, ((PyDictObject *)seq)->ma_used))
+ if (dictresize(mp, PySet_GET_SIZE(seq)))
return NULL;
while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) {
@@ -1227,19 +1227,24 @@ dict_fromkeys(PyObject *cls, PyObject *args)
return NULL;
}
- for (;;) {
- key = PyIter_Next(it);
- if (key == NULL) {
- if (PyErr_Occurred())
+ if (PyDict_CheckExact(d)) {
+ while ((key = PyIter_Next(it)) != NULL) {
+ status = PyDict_SetItem(d, key, value);
+ Py_DECREF(key);
+ if (status < 0)
+ goto Fail;
+ }
+ } else {
+ while ((key = PyIter_Next(it)) != NULL) {
+ status = PyObject_SetItem(d, key, value);
+ Py_DECREF(key);
+ if (status < 0)
goto Fail;
- break;
}
- status = PyObject_SetItem(d, key, value);
- Py_DECREF(key);
- if (status < 0)
- goto Fail;
}
+ if (PyErr_Occurred())
+ goto Fail;
Py_DECREF(it);
return d;