8000 Use freelist for rangeiter object · python/cpython@6adf31c · GitHub
[go: up one dir, main page]

Skip to content

Commit 6adf31c

Browse files
committed
Use freelist for rangeiter object
1 parent cb83490 commit 6adf31c

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

Include/internal/pycore_freelist_state.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ extern "C" {
1717
# define Py_ints_MAXFREELIST 100
1818
# define Py_slices_MAXFREELIST 1
1919
# define Py_ranges_MAXFREELIST 10
20+
# define Py_rangeiters_MAXFREELIST 10
2021
# define Py_contexts_MAXFREELIST 255
2122
# define Py_async_gens_MAXFREELIST 80
2223
# define Py_async_gen_asends_MAXFREELIST 80
@@ -44,6 +45,7 @@ struct _Py_freelists {
4445
struct _Py_freelist dictkeys;
4546
struct _Py_freelist slices;
4647
struct _Py_freelist ranges;
48+
struct _Py_freelist rangeiters;
4749
struct _Py_freelist contexts;
4850
struct _Py_freelist async_gens;
4951
struct _Py_freelist async_gen_asends;

Objects/rangeobject.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,12 @@ rangeiter_setstate(_PyRangeIterObject *r, PyObject *state)
885885
Py_RETURN_NONE;
886886
}
887887

888+
static void
889+
rangeiter_dealloc(_PyRangeIterObject *r)
890+
{
891+
_Py_FREELIST_FREE(rangeiters, r, PyObject_Free);
892+
}
893+
888894
PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
889895
PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
890896

@@ -904,7 +910,7 @@ PyTypeObject PyRangeIter_Type = {
904910
sizeof(_PyRangeIterObject), /* tp_basicsize */
905911
0, /* tp_itemsize */
906912
/* methods */
907-
(destructor)PyObject_Free, /* tp_dealloc */
913+
(destructor)rangeiter_dealloc, /* tp_dealloc */
908914
0, /* tp_vectorcall_offset */
909915
0, /* tp_getattr */
910916
0, /* tp_setattr */
@@ -965,9 +971,12 @@ get_len_of_range(long lo, long hi, long step)
965971
static PyObject *
966972
fast_range_iter(long start, long stop, long step, long len)
967973
{
968-
_PyRangeIterObject *it = PyObject_New(_PyRangeIterObject, &PyRangeIter_Type);
969-
if (it == NULL)
970-
return NULL;
974+
_PyRangeIterObject *it = _Py_FREELIST_POP(_PyRangeIterObject, rangeiters);
975+
if (it == NULL) {
976+
it = PyObject_New(_PyRangeIterObject, &PyRangeIter_Type);
977+
if (it == NULL)
978+
return NULL;
979+
}
971980
it->start = start;
972981
it->step = step;
973982
it->len = len;

0 commit comments

Comments
 (0)
0