[Python-checkins] python/dist/src/Include setobject.h,2.5,2.6
rhettinger@users.sourceforge.net
rhettinger at users.sourceforge.net
Sun Jul 31 03:16:39 CEST 2005
Update of /cvsroot/python/python/dist/src/Include
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27783/Include
Modified Files:
setobject.h
Log Message:
Revised the set() and frozenset() implementaion to use its own internal
data structure instead of using dictionaries. Reduces memory consumption
by 1/3 and provides modest speed-ups for most set operations.
Index: setobject.h
===================================================================
RCS file: /cvsroot/python/python/dist/src/Include/setobject.h,v
retrieving revision 2.5
retrieving revision 2.6
diff -u -d -r2.5 -r2.6
--- setobject.h 28 Oct 2004 16:31:59 -0000 2.5
+++ setobject.h 31 Jul 2005 01:16:36 -0000 2.6
@@ -1,4 +1,3 @@
-
/* Set object interface */
#ifndef Py_SETOBJECT_H
@@ -7,28 +6,61 @@
extern "C" {
#endif
+
/*
-This data structure is shared by set and frozenset objects.
+There are three kinds of slots in the table:
+
+1. Unused: key == NULL
+2. Active: key != NULL and key != dummy
+3. Dummy: key == dummy
*/
+#define PySet_MINSIZE 8
+
typedef struct {
+ long hash; /* cached hash code for the entry key */
+ PyObject *key;
+} setentry;
+
+
+/*
+This data structure is shared by set and frozenset objects.
+*/
+
+typedef struct _setobject PySetObject;
+struct _setobject {
PyObject_HEAD
- PyObject *data;
- long hash; /* only used by frozenset objects */
- PyObject *weakreflist; /* List of weak references */
- /* Invariants:
- * data is a dictionary whose values are all True.
- * data points to the same dict for the whole life of the set.
- * For frozensets only:
- * data is immutable.
- * hash is the hash of the frozenset or -1 if not computed yet.
+ int fill; /* # Active + # Dummy */
+ int used; /* # Active */
+
+ /* The table contains mask + 1 slots, and that's a power of 2.
+ * We store the mask instead of the size because the mask is more
+ * frequently needed.
*/
-} PySetObject;
+ int mask;
+
+ /* table points to smalltable for small tables, else to
+ * additional malloc'ed memory. table is never NULL! This rule
+ * saves repeated runtime null-tests in the workhorse getitem and
+ * setitem calls.
+ */
+ setentry *table;
+ setentry *(*lookup)(PySetObject *so, PyObject *key, long hash);
+ setentry smalltable[PySet_MINSIZE];
+
+ long hash; /* only used by frozenset objects */
+ PyObject *weakreflist; /* List of weak references */
+};
PyAPI_DATA(PyTypeObject) PySet_Type;
PyAPI_DATA(PyTypeObject) PyFrozenSet_Type;
+/* Invariants for frozensets only:
+ * data is immutable.
+ * hash is the hash of the frozenset or -1 if not computed yet.
+ */
+
#define PyFrozenSet_CheckExact(ob) ((ob)->ob_type == &PyFrozenSet_Type)
#define PyAnySet_Check(ob) \
((ob)->ob_type == &PySet_Type || (ob)->ob_type == &PyFrozenSet_Type || \
More information about the Python-checkins
mailing list