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

Skip to content

Commit cb83490

Browse files
committed
Use freelist for range object
1 parent d61542b commit cb83490

File tree

2 files changed

+12
-5
lines changed

2 files changed

+12
-5
lines changed

Include/internal/pycore_freelist_state.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ extern "C" {
1616
# define Py_floats_MAXFREELIST 100
1717
# define Py_ints_MAXFREELIST 100
1818
# define Py_slices_MAXFREELIST 1
19+
# define Py_ranges_MAXFREELIST 10
1920
# define Py_contexts_MAXFREELIST 255
2021
# define Py_async_gens_MAXFREELIST 80
2122
# define Py_async_gen_asends_MAXFREELIST 80
@@ -42,6 +43,7 @@ struct _Py_freelists {
4243
struct _Py_freelist dicts;
4344
struct _Py_freelist dictkeys;
4445
struct _Py_freelist slices;
46+
struct _Py_freelist ranges;
4547
struct _Py_freelist contexts;
4648
struct _Py_freelist async_gens;
4749
struct _Py_freelist async_gen_asends;

Objects/rangeobject.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "Python.h"
44
#include "pycore_abstract.h" // _PyIndex_Check()
55
#include "pycore_ceval.h" // _PyEval_GetBuiltin()
6+
#include "pycore_freelist.h" // _Py_FREELIST_FREE(), _Py_FREELIST_POP()
67
#include "pycore_long.h" // _PyLong_GetZero()
78
#include "pycore_modsupport.h" // _PyArg_NoKwnames()
89
#include "pycore_range.h"
@@ -51,16 +52,20 @@ static rangeobject *
5152
make_range_object(PyTypeObject *type, PyObject *start,
5253
PyObject *stop, PyObject *step)
5354
{
54-
rangeobject *obj = NULL;
5555
PyObject *length;
5656
length = compute_range_length(start, stop, step);
5757
if (length == NULL) {
5858
return NULL;
5959
}
60-
obj = PyObject_New(rangeobject, type);
60+
rangeobject *obj = _Py_FREELIST_POP(rangeobject, ranges);
6161
if (obj == NULL) {
62-
Py_DECREF(length);
63-
return NULL;
62+
obj = PyObject_New(rangeobject, type);
63+
if (obj == NULL) {
64+
Py_DECREF(length);
65+
return NULL;
66+
}
67+
} else {
68+
//printf("rangeobject from freelist!\n");
6469
}
6570
obj->start = start;
6671
obj->stop = stop;
@@ -170,7 +175,7 @@ range_dealloc(rangeobject *r)
170175
Py_DECREF(r->stop);
171176
Py_DECREF(r->step);
172177
Py_DECREF(r->length);
173-
PyObject_Free(r);
178+
_Py_FREELIST_FREE(ranges, r, PyObject_Free);
174179
}
175180

176181
static unsigned long

0 commit comments

Comments
 (0)
0