Skip to content

Commit f66e336

Browse files
csabellamethane
authored andcommitted
bpo-29202: improve dict iteration (pythonGH-11900)
Use fewer iterations instead of iterating over the whole entry table.
1 parent 6a8c313 commit f66e336

File tree

1 file changed

+6
-9
lines changed

1 file changed

+6
-9
lines changed

Objects/dictobject.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2147,7 +2147,7 @@ dict_keys(PyDictObject *mp)
21472147
PyObject *v;
21482148
Py_ssize_t i, j;
21492149
PyDictKeyEntry *ep;
2150-
Py_ssize_t size, n, offset;
2150+
Py_ssize_t n, offset;
21512151
PyObject **value_ptr;
21522152

21532153
again:
@@ -2163,7 +2163,6 @@ dict_keys(PyDictObject *mp)
21632163
goto again;
21642164
}
21652165
ep = DK_ENTRIES(mp->ma_keys);
2166-
size = mp->ma_keys->dk_nentries;
21672166
if (mp->ma_values) {
21682167
value_ptr = mp->ma_values;
21692168
offset = sizeof(PyObject *);
@@ -2172,7 +2171,7 @@ dict_keys(PyDictObject *mp)
21722171
value_ptr = &ep[0].me_value;
21732172
offset = sizeof(PyDictKeyEntry);
21742173
}
2175-
for (i = 0, j = 0; i < size; i++) {
2174+
for (i = 0, j = 0; j < n; i++) {
21762175
if (*value_ptr != NULL) {
21772176
PyObject *key = ep[i].me_key;
21782177
Py_INCREF(key);
@@ -2191,7 +2190,7 @@ dict_values(PyDictObject *mp)
21912190
PyObject *v;
21922191
Py_ssize_t i, j;
21932192
PyDictKeyEntry *ep;
2194-
Py_ssize_t size, n, offset;
2193+
Py_ssize_t n, offset;
21952194
PyObject **value_ptr;
21962195

21972196
again:
@@ -2207,7 +2206,6 @@ dict_values(PyDictObject *mp)
22072206
goto again;
22082207
}
22092208
ep = DK_ENTRIES(mp->ma_keys);
2210-
size = mp->ma_keys->dk_nentries;
22112209
if (mp->ma_values) {
22122210
value_ptr = mp->ma_values;
22132211
offset = sizeof(PyObject *);
@@ -2216,7 +2214,7 @@ dict_values(PyDictObject *mp)
22162214
value_ptr = &ep[0].me_value;
22172215
offset = sizeof(PyDictKeyEntry);
22182216
}
2219-
for (i = 0, j = 0; i < size; i++) {
2217+
for (i = 0, j = 0; j < n; i++) {
22202218
PyObject *value = *value_ptr;
22212219
value_ptr = (PyObject **)(((char *)value_ptr) + offset);
22222220
if (value != NULL) {
@@ -2234,7 +2232,7 @@ dict_items(PyDictObject *mp)
22342232
{
22352233
PyObject *v;
22362234
Py_ssize_t i, j, n;
2237-
Py_ssize_t size, offset;
2235+
Py_ssize_t offset;
22382236
PyObject *item, *key;
22392237
PyDictKeyEntry *ep;
22402238
PyObject **value_ptr;
@@ -2265,7 +2263,6 @@ dict_items(PyDictObject *mp)
22652263
}
22662264
/* Nothing we do below makes any function calls. */
22672265
ep = DK_ENTRIES(mp->ma_keys);
2268-
size = mp->ma_keys->dk_nentries;
22692266
if (mp->ma_values) {
22702267
value_ptr = mp->ma_values;
22712268
offset = sizeof(PyObject *);
@@ -2274,7 +2271,7 @@ dict_items(PyDictObject *mp)
22742271
value_ptr = &ep[0].me_value;
22752272
offset = sizeof(PyDictKeyEntry);
22762273
}
2277-
for (i = 0, j = 0; i < size; i++) {
2274+
for (i = 0, j = 0; j < n; i++) {
22782275
PyObject *value = *value_ptr;
22792276
value_ptr = (PyObject **)(((char *)value_ptr) + offset);
22802277
if (value != NULL) {

0 commit comments

Comments
 (0)