[Lxml-checkins] r42730 - lxml/trunk/src/lxml

scoder at codespeak.net scoder at codespeak.net
Sun May 6 11:10:59 CEST 2007


Author: scoder
Date: Sun May  6 11:10:59 2007
New Revision: 42730

Modified:
   lxml/trunk/src/lxml/etree.pyx
   lxml/trunk/src/lxml/etree_defs.h
   lxml/trunk/src/lxml/python.pxd
Log:
fast path for instantiation of _Element class (20% faster)

Modified: lxml/trunk/src/lxml/etree.pyx
==============================================================================
--- lxml/trunk/src/lxml/etree.pyx	(original)
+++ lxml/trunk/src/lxml/etree.pyx	Sun May  6 11:10:59 2007
@@ -1043,6 +1043,9 @@
 else:
     ELEMENT_CREATION_LOCK = NULL
 
+cdef extern from "etree_defs.h":
+    cdef _Element NEW_ELEMENT "PY_NEW" (object t)
+
 cdef _Element _elementFactory(_Document doc, xmlNode* c_node):
     cdef python.PyThreadState* state
     cdef _Element result
@@ -1061,9 +1064,13 @@
             python.PyThread_release_lock(ELEMENT_CREATION_LOCK)
             return result
 
-    element_class = LOOKUP_ELEMENT_CLASS(ELEMENT_CLASS_LOOKUP_STATE,
-                                         doc, c_node)
-    result = element_class()
+    element_class = LOOKUP_ELEMENT_CLASS(
+        ELEMENT_CLASS_LOOKUP_STATE, doc, c_node)
+    if element_class is _Element:
+        # fast path for standard _Element class
+        result = NEW_ELEMENT(_Element)
+    else:
+        result = element_class()
     result._doc = doc
     result._c_node = c_node
     registerProxy(result)
@@ -1071,7 +1078,8 @@
     if config.ENABLE_THREADING:
         python.PyThread_release_lock(ELEMENT_CREATION_LOCK)
 
-    result._init()
+    if element_class is not _Element:
+        result._init()
     return result
 
 

Modified: lxml/trunk/src/lxml/etree_defs.h
==============================================================================
--- lxml/trunk/src/lxml/etree_defs.h	(original)
+++ lxml/trunk/src/lxml/etree_defs.h	Sun May  6 11:10:59 2007
@@ -64,6 +64,16 @@
 #define iter(o)         PyObject_GetIter(o)
 #define _cstr(s)        PyString_AS_STRING(s)
 
+static PyObject* __PY_NEW_GLOBAL_EMPTY_TUPLE = NULL;
+
+#define PY_NEW(T) \
+     (((PyTypeObject*)(T))->tp_new( \
+         (PyTypeObject*)(T), \
+         ((__PY_NEW_GLOBAL_EMPTY_TUPLE == NULL) ? \
+             (__PY_NEW_GLOBAL_EMPTY_TUPLE = PyTuple_New(0)) : \
+             (__PY_NEW_GLOBAL_EMPTY_TUPLE)), \
+         NULL))
+
 #define _isString(obj)   PyObject_TypeCheck(obj, &PyBaseString_Type)
 
 #define _isElement(c_node) \

Modified: lxml/trunk/src/lxml/python.pxd
==============================================================================
--- lxml/trunk/src/lxml/python.pxd	(original)
+++ lxml/trunk/src/lxml/python.pxd	Sun May  6 11:10:59 2007
@@ -112,3 +112,4 @@
     cdef object repr(object obj)
     cdef object iter(object obj)
     cdef char* _cstr(object s)
+    cdef object PY_NEW(object t)


More information about the lxml-checkins mailing list