Skip to content

Commit

Permalink
bpo-29949: Fix set memory usage regression (pythonGH-943)
Browse files Browse the repository at this point in the history
Revert "Minor factoring:  move redundant resize scaling logic into the resize function."

This reverts commit 4897300.
  • Loading branch information
methane committed Apr 1, 2017
1 parent cd815ed commit e82cf86
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 6 deletions.
2 changes: 2 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ What's New in Python 3.7.0 alpha 1?
Core and Builtins
-----------------

- bpo-29949: Fix memory usage regression of set and frozenset object.

- bpo-29935: Fixed error messages in the index() method of tuple, list and deque
when pass indices of wrong type.

Expand Down
11 changes: 5 additions & 6 deletions Objects/setobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash)
entry->hash = hash;
if ((size_t)so->fill*5 < mask*3)
return 0;
return set_table_resize(so, so->used);
return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);

found_active:
Py_DECREF(key);
Expand Down Expand Up @@ -302,7 +302,6 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
setentry small_copy[PySet_MINSIZE];

assert(minused >= 0);
minused = (minused > 50000) ? minused * 2 : minused * 4;

/* Find the smallest table size > minused. */
/* XXX speed-up with intrinsics */
Expand Down Expand Up @@ -643,8 +642,8 @@ set_merge(PySetObject *so, PyObject *otherset)
* that there will be no (or few) overlapping keys.
*/
if ((so->fill + other->used)*5 >= so->mask*3) {
if (set_table_resize(so, so->used + other->used) != 0)
return -1;
if (set_table_resize(so, (so->used + other->used)*2) != 0)
return -1;
}
so_entry = so->table;
other_entry = other->table;
Expand Down Expand Up @@ -987,7 +986,7 @@ set_update_internal(PySetObject *so, PyObject *other)
if (dictsize < 0)
return -1;
if ((so->fill + dictsize)*5 >= so->mask*3) {
if (set_table_resize(so, so->used + dictsize) != 0)
if (set_table_resize(so, (so->used + dictsize)*2) != 0)
return -1;
}
while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
Expand Down Expand Up @@ -1507,7 +1506,7 @@ set_difference_update_internal(PySetObject *so, PyObject *other)
/* If more than 1/4th are dummies, then resize them away. */
if ((size_t)(so->fill - so->used) <= (size_t)so->mask / 4)
return 0;
return set_table_resize(so, so->used);
return set_table_resize(so, so->used>50000 ? so->used*2 : so->used*4);
}

static PyObject *
Expand Down

0 comments on commit e82cf86

Please sign in to comment.