Index: listobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/listobject.c,v retrieving revision 2.203 diff -c -r2.203 listobject.c *** listobject.c 12 Apr 2004 17:21:03 -0000 2.203 --- listobject.c 4 May 2004 17:32:46 -0000 *************** *** 49,54 **** --- 49,59 ---- return 0; } + /* Empty list reuse scheme to save calls to malloc and free */ + #define MAXFREELISTS 80 + static PyListObject *free_lists[MAXFREELISTS]; + static int num_free_lists = 0; + PyObject * PyList_New(int size) { *************** *** 63,71 **** if (nbytes / sizeof(PyObject *) != (size_t)size) { return PyErr_NoMemory(); } ! op = PyObject_GC_New(PyListObject, &PyList_Type); ! if (op == NULL) { ! return NULL; } if (size <= 0) { op->ob_item = NULL; --- 68,81 ---- if (nbytes / sizeof(PyObject *) != (size_t)size) { return PyErr_NoMemory(); } ! if (num_free_lists) { ! num_free_lists--; ! op = free_lists[num_free_lists]; ! _Py_NewReference((PyObject *)op); ! } else { ! op = PyObject_GC_New(PyListObject, &PyList_Type); ! if (op == NULL) ! return NULL; } if (size <= 0) { op->ob_item = NULL; *************** *** 233,239 **** } PyMem_FREE(op->ob_item); } ! op->ob_type->tp_free((PyObject *)op); Py_TRASHCAN_SAFE_END(op) } --- 243,252 ---- } PyMem_FREE(op->ob_item); } ! if (num_free_lists < MAXFREELISTS && PyList_CheckExact(op)) ! free_lists[num_free_lists++] = op; ! else ! op->ob_type->tp_free((PyObject *)op); Py_TRASHCAN_SAFE_END(op) }