[Lxml-checkins] r49958 - in lxml/trunk: . doc src/lxml

scoder at codespeak.net scoder at codespeak.net
Thu Dec 20 18:32:36 CET 2007


Author: scoder
Date: Thu Dec 20 18:32:36 2007
New Revision: 49958

Modified:
   lxml/trunk/   (props changed)
   lxml/trunk/doc/performance.txt
   lxml/trunk/src/lxml/classlookup.pxi
Log:
 r3166 at delle:  sbehnel | 2007-12-20 18:32:27 +0100
 tiny speedup in element instantiation


Modified: lxml/trunk/doc/performance.txt
==============================================================================
--- lxml/trunk/doc/performance.txt	(original)
+++ lxml/trunk/doc/performance.txt	Thu Dec 20 18:32:36 2007
@@ -203,7 +203,7 @@
        T1: 0.0914 0.0875 0.0872 0.0892 0.0882 0.0900
        T2: 0.0894 0.0897 0.0892 0.0988 0.0978 0.0974
        T3: 0.0219 0.0194 0.0189 0.0570 0.0570 0.0573
-       T4: 0.0004 0.0004 0.0004 0.0012 0.0013 0.0012
+       T4: 0.0004 0.0003 0.0003 0.0012 0.0012 0.0012
   cET:       --     S-     U-     -A     SA     UA  
        T1: 0.0272 0.0264 0.0267 0.0268 0.0261 0.0265
        T2: 0.0280 0.0274 0.0273 0.0273 0.0276 0.0275
@@ -367,19 +367,19 @@
 especially if few elements are of interest or the target element tag name is
 known, lxml is a good choice::
 
-  lxe: getiterator_all      (--TR T1)    6.0360 msec/pass
+  lxe: getiterator_all      (--TR T1)    5.8582 msec/pass
   cET: getiterator_all      (--TR T1)   39.9489 msec/pass
   ET : getiterator_all      (--TR T1)   23.0000 msec/pass
 
-  lxe: getiterator_islice   (--TR T2)    0.0851 msec/pass
+  lxe: getiterator_islice   (--TR T2)    0.0780 msec/pass
   cET: getiterator_islice   (--TR T2)    0.3440 msec/pass
   ET : getiterator_islice   (--TR T2)    0.2429 msec/pass
 
-  lxe: getiterator_tag      (--TR T2)    0.3290 msec/pass
+  lxe: getiterator_tag      (--TR T2)    0.3119 msec/pass
   cET: getiterator_tag      (--TR T2)   14.1001 msec/pass
   ET : getiterator_tag      (--TR T2)    7.4241 msec/pass
 
-  lxe: getiterator_tag_all  (--TR T2)    0.7281 msec/pass
+  lxe: getiterator_tag_all  (--TR T2)    0.6540 msec/pass
   cET: getiterator_tag_all  (--TR T2)   40.7901 msec/pass
   ET : getiterator_tag_all  (--TR T2)   21.0390 msec/pass
 

Modified: lxml/trunk/src/lxml/classlookup.pxi
==============================================================================
--- lxml/trunk/src/lxml/classlookup.pxi	(original)
+++ lxml/trunk/src/lxml/classlookup.pxi	Thu Dec 20 18:32:36 2007
@@ -102,49 +102,50 @@
     def __init__(self, element=None, comment=None, pi=None, entity=None):
         self._lookup_function = _lookupDefaultElementClass
         if element is None:
-            self.element_class = None
+            self.element_class = _Element
         elif issubclass(element, ElementBase):
             self.element_class = element
         else:
             raise TypeError, "element class must be subclass of ElementBase"
 
         if comment is None:
-            self.comment_class = None
+            self.comment_class = _Comment
         elif issubclass(comment, CommentBase):
             self.comment_class = comment
         else:
             raise TypeError, "comment class must be subclass of CommentBase"
 
-        if pi is None:
-            self.pi_class = None
-        elif issubclass(pi, PIBase):
-            self.pi_class = pi
-        else:
-            raise TypeError, "PI class must be subclass of PIBase"
-
         if entity is None:
-            self.entity_class = None
+            self.entity_class = _Entity
         elif issubclass(entity, EntityBase):
             self.entity_class = entity
         else:
             raise TypeError, "Entity class must be subclass of EntityBase"
 
+        if pi is None:
+            self.pi_class = None # special case, see below
+        elif issubclass(pi, PIBase):
+            self.pi_class = pi
+        else:
+            raise TypeError, "PI class must be subclass of PIBase"
+
 cdef object _lookupDefaultElementClass(state, _Document _doc, xmlNode* c_node):
     "Trivial class lookup function that always returns the default class."
     if c_node.type == tree.XML_ELEMENT_NODE:
         if state is not None:
-            cls =  (<ElementDefaultClassLookup>state).element_class
-        if cls is None:
-            return _Element
+            return (<ElementDefaultClassLookup>state).element_class
         else:
-            return cls
+            return _Element
     elif c_node.type == tree.XML_COMMENT_NODE:
         if state is not None:
-            cls = (<ElementDefaultClassLookup>state).comment_class
-        if cls is None:
+            return (<ElementDefaultClassLookup>state).comment_class
+        else:
             return _Comment
+    elif c_node.type == tree.XML_ENTITY_REF_NODE:
+        if state is not None:
+            return (<ElementDefaultClassLookup>state).entity_class
         else:
-            return cls
+            return _Entity
     elif c_node.type == tree.XML_PI_NODE:
         if state is not None:
             cls = (<ElementDefaultClassLookup>state).pi_class
@@ -158,13 +159,6 @@
             return _ProcessingInstruction
         else:
             return cls
-    elif c_node.type == tree.XML_ENTITY_REF_NODE:
-        if state is not None:
-            cls = (<ElementDefaultClassLookup>state).entity_class
-        if cls is None:
-            return _Entity
-        else:
-            return cls
     else:
         assert 0, "Unknown node type: %s" % c_node.type
 
@@ -220,12 +214,10 @@
         self._lookup_function = _parser_class_lookup
 
 cdef object _parser_class_lookup(state, _Document doc, xmlNode* c_node):
-    cdef FallbackElementClassLookup lookup
-    lookup = <FallbackElementClassLookup>state
     if doc._parser._class_lookup is not None:
         return doc._parser._class_lookup._lookup_function(
             doc._parser._class_lookup, doc, c_node)
-    return lookup._callFallback(doc, c_node)
+    return (<FallbackElementClassLookup>state)._callFallback(doc, c_node)
 
 
 cdef class CustomElementClassLookup(FallbackElementClassLookup):


More information about the lxml-checkins mailing list