[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