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 15:32:24 -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,68 **** --- 68,83 ---- if (nbytes / sizeof(PyObject *) != (size_t)size) { return PyErr_NoMemory(); } + if (size == 0 && num_free_lists) { + num_free_lists--; + op = free_lists[num_free_lists]; + _Py_NewReference((PyObject *)op); + assert(op->ob_item == NULL); + op->ob_size = 0; + op->allocated = 0; + _PyObject_GC_TRACK(op); + return (PyObject *) op; + } op = PyObject_GC_New(PyListObject, &PyList_Type); if (op == NULL) { return NULL; *************** *** 233,239 **** } PyMem_FREE(op->ob_item); } ! op->ob_type->tp_free((PyObject *)op); Py_TRASHCAN_SAFE_END(op) } --- 248,258 ---- } PyMem_FREE(op->ob_item); } ! if (num_free_lists < MAXFREELISTS && PyList_CheckExact(op)) { ! op->ob_item = NULL; ! free_lists[num_free_lists++] = op; ! } else ! op->ob_type->tp_free((PyObject *)op); Py_TRASHCAN_SAFE_END(op) }