cpython: dd67c8c53aea (original) (raw)

Mercurial > cpython

changeset 99484:dd67c8c53aea

Issue #25638: Optimized ElementTree.iterparse(); it is now 2x faster. ElementTree.XMLParser._setevents now accepts any objects with the append method, not just a list. [#25638]

Serhiy Storchaka storchaka@gmail.com
date Mon, 07 Dec 2015 02:31:11 +0200
parents 2cf16918b632
children b4aeb35ab7e1
files Lib/xml/etree/ElementTree.py Misc/NEWS Modules/_elementtree.c Modules/clinic/_elementtree.c.h
diffstat 4 files changed, 56 insertions(+), 80 deletions(-)[+] [-] Lib/xml/etree/ElementTree.py 92 Misc/NEWS 2 Modules/_elementtree.c 35 Modules/clinic/_elementtree.c.h 7

line wrap: on

line diff

--- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -95,6 +95,7 @@ import sys import re import warnings import io +import collections import contextlib from . import ElementPath @@ -1198,16 +1199,37 @@ def iterparse(source, events=None, parse Returns an iterator providing (event, elem) pairs. """

+

+ close_source = False if not hasattr(source, "read"): source = open(source, "rb") close_source = True

+

class XMLPullParser: @@ -1217,9 +1239,7 @@ class XMLPullParser: # upon in user code. It will be removed in a future release. # See http://bugs.python.org/issue17741 for more details.

@@ -1257,64 +1277,14 @@ class XMLPullParser: retrieved from the iterator. """ events = self._events_queue

-class _IterParseIterator: -

-

-

- - def XML(text, parser=None): """Parse XML document from string constant.

--- a/Misc/NEWS +++ b/Misc/NEWS @@ -109,6 +109,8 @@ Core and Builtins Library ------- +- Issue #25638: Optimized ElementTree.iterparse(); it is now 2x faster. +

--- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -2289,7 +2289,7 @@ typedef struct { PyObject element_factory; / element tracing */

{ if (action != NULL) {

if (!uri) @@ -3062,7 +3063,7 @@ expat_end_ns_handler(XMLParserObject* se if (PyErr_Occurred()) return;

treebuilder_append_event(target, target->end_ns_event_obj, Py_None); @@ -3551,7 +3552,7 @@ static PyObject /[clinic input] _elementtree.XMLParser._setevents

-/[clinic end generated code: output=1440092922b13ed1 input=59db9742910c6174]/ +/[clinic end generated code: output=1440092922b13ed1 input=abf90830a1c3b0fc]/ { /* activate element event reporting */ Py_ssize_t i, seqlen; TreeBuilderObject *target;

if (!TreeBuilder_CheckExact(self->target)) { PyErr_SetString( @@ -3579,9 +3580,11 @@ static PyObject target = (TreeBuilderObject) self->target;

/* clear out existing events */ Py_CLEAR(target->start_event_obj);

--- a/Modules/clinic/_elementtree.c.h +++ b/Modules/clinic/_elementtree.c.h @@ -668,12 +668,13 @@ static PyObject * PyObject *events_queue; PyObject *events_to_report = Py_None;