]> granicus.if.org Git - python/commitdiff
Issue #25638: Optimized ElementTree parsing; it is now 10% faster.
authorSerhiy Storchaka <storchaka@gmail.com>
Thu, 10 Dec 2015 07:51:53 +0000 (09:51 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Thu, 10 Dec 2015 07:51:53 +0000 (09:51 +0200)
Misc/NEWS
Modules/_elementtree.c

index 67cd7bbe16d7aa861764b5e739c3a039498555f4..372c35590f9a7796f59340cc0596b1a401df48b4 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -110,6 +110,7 @@ Library
 -------
 
 - Issue #25638: Optimized ElementTree.iterparse(); it is now 2x faster.
+  Optimized ElementTree parsing; it is now 10% faster.
 
 - Issue #25761: Improved detecting errors in broken pickle data.
 
index 3cf3d59f12021b332f8ec5d0e363c325c859157f..c483d878b7268df388463c4b012712913a26b901 100644 (file)
@@ -2491,10 +2491,17 @@ treebuilder_handle_start(TreeBuilderObject* self, PyObject* tag,
         self->data = NULL;
     }
 
-    if (self->element_factory && self->element_factory != Py_None) {
-        node = PyObject_CallFunction(self->element_factory, "OO", tag, attrib);
-    } else {
+    if (!self->element_factory || self->element_factory == Py_None) {
         node = create_new_element(tag, attrib);
+    } else if (attrib == Py_None) {
+        attrib = PyDict_New();
+        if (!attrib)
+            return NULL;
+        node = PyObject_CallFunction(self->element_factory, "OO", tag, attrib);
+        Py_DECREF(attrib);
+    }
+    else {
+        node = PyObject_CallFunction(self->element_factory, "OO", tag, attrib);
     }
     if (!node) {
         return NULL;
@@ -2959,12 +2966,8 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
             attrib_in += 2;
         }
     } else {
-        /* Pass an empty dictionary on */
-        attrib = PyDict_New();
-        if (!attrib) {
-            Py_DECREF(tag);
-            return;
-        }
+        Py_INCREF(Py_None);
+        attrib = Py_None;
     }
 
     if (TreeBuilder_CheckExact(self->target)) {
@@ -2973,6 +2976,14 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
                                        tag, attrib);
     }
     else if (self->handle_start) {
+        if (attrib == Py_None) {
+            Py_DECREF(attrib);
+            attrib = PyDict_New();
+            if (!attrib) {
+                Py_DECREF(tag);
+                return;
+            }
+        }
         res = PyObject_CallFunction(self->handle_start, "OO", tag, attrib);
     } else
         res = NULL;