You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Verify the etree_parse and etree_iterparse benchmarks are working appropriately #69824
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee=Noneclosed_at=<Date2016-03-12.17:21:48.895>created_at=<Date2015-11-16.19:41:23.215>labels= ['extension-modules', 'expert-XML', 'library', 'invalid', 'performance']
title='Verify the etree_parse and etree_iterparse benchmarks are working appropriately'updated_at=<Date2018-12-14.22:10:01.246>user='https://github.com/brettcannon'
If you look at bit.ly/pycon-ca-keynote you will notice that the etree_parse and etree_iterparse benchmarks were horrible for everyone. Because of how badly everyone seemed to do, I think the benchmarks should be verified to be doing reasonable things on implementations other than CPython 2.7.
That link is to a Jupyter notebook so you don't have to watch anything. Plus the video is not even up yet so you can't skip the keynote even if you wanted to since you can't watch it yet. :)
Ok, so when you say "horrible for everyone", this is really IronPython and Jython, right? :-) Other runtimes seem to do ok (perhaps not stellar, but ok).
Well, Jython and IronPython obviously did the worst, but even Python 3 didn't do as well as I would have expected, so I still want to double-check the benchmarks to see if it's obvious why CPython 2.7 beats out everyone.
Let's not pollute the issue with a critique of my notebook. You can feel free to email me personally to discuss it if you want, including why I purposefully didn't use a logarithmic scale.
How tests were ran? There are two implementations of ElementTree, accelerated and non-accelerated. xml.etree.ElementTree by default is accelerated in Python 3, but non-accelerated in Python 2.
If run the test with the same options --etree-module=xml.etree.ElementTree, it will use accelerated implementation in Python 3 and non-accelerated in Python 2.
Thank you for your review Brett. First than apply this optimization I want to fix errors propagating issue (bpo-25814). The patch for it is mainly the simplified part of the patch for this issue.
The iterparse benchmark in 3.6 still is 30% slower than in 2.7. The parse benchmark is 70% slower. Hence there are other causes of the slowing down.
One of causes is that in 3.x an empty dict instead of None is passed to start handler as attrib parameter if the start tag has no attributes. This makes parsing parsing about 10% slower.
Following patch speeds up ElementTree parsing (the result of the etree parse benchmark is improved by 10%). Actually it restores 2.7 code and avoids creating an empty dict for attributes if not needed.
I think this issue can be closed now. The etree_parse and etree_iterparse benchmarks are working appropriately and showing real regression in CPython 3.x. The cause of the regression is not known.
Activity
brettcannon commentedon Nov 16, 2015
If you look at bit.ly/pycon-ca-keynote you will notice that the etree_parse and etree_iterparse benchmarks were horrible for everyone. Because of how badly everyone seemed to do, I think the benchmarks should be verified to be doing reasonable things on implementations other than CPython 2.7.
pitrou commentedon Nov 16, 2015
Would you have a quick summary for those not willing to watch a whole keynote?
brettcannon commentedon Nov 16, 2015
That link is to a Jupyter notebook so you don't have to watch anything. Plus the video is not even up yet so you can't skip the keynote even if you wanted to since you can't watch it yet. :)
pitrou commentedon Nov 16, 2015
Ok, so when you say "horrible for everyone", this is really IronPython and Jython, right? :-) Other runtimes seem to do ok (perhaps not stellar, but ok).
brettcannon commentedon Nov 16, 2015
Well, Jython and IronPython obviously did the worst, but even Python 3 didn't do as well as I would have expected, so I still want to double-check the benchmarks to see if it's obvious why CPython 2.7 beats out everyone.
serhiy-storchaka commentedon Nov 16, 2015
I think these histograms would look better with logarithmic scale.
brettcannon commentedon Nov 16, 2015
Let's not pollute the issue with a critique of my notebook. You can feel free to email me personally to discuss it if you want, including why I purposefully didn't use a logarithmic scale.
serhiy-storchaka commentedon Nov 20, 2015
Sorry Brett.
How tests were ran? There are two implementations of ElementTree, accelerated and non-accelerated. xml.etree.ElementTree by default is accelerated in Python 3, but non-accelerated in Python 2.
If run the test with the same options --etree-module=xml.etree.ElementTree, it will use accelerated implementation in Python 3 and non-accelerated in Python 2.
brettcannon commentedon Nov 20, 2015
The commands I used are in the notebook for each implementation and you can get the same result with
python3 perf.py -b etree python2 python3.serhiy-storchaka commentedon Nov 20, 2015
The slowing down Python 3 can be related to adding XMLPullParser (bpo-17741).
serhiy-storchaka commentedon Nov 21, 2015
Proposed patch optimizes iterparse(). Now it is only 33% slower than in 2.7 (was 2.6 times slower).
2 remaining items
serhiy-storchaka commentedon Nov 26, 2015
Updated to tip.
brettcannon commentedon Dec 5, 2015
Serhiy's latest patch LGTM.
serhiy-storchaka commentedon Dec 6, 2015
Thank you for your review Brett. First than apply this optimization I want to fix errors propagating issue (bpo-25814). The patch for it is mainly the simplified part of the patch for this issue.
python-dev commentedon Dec 7, 2015
New changeset dd67c8c53aea by Serhiy Storchaka in branch 'default':
Issue bpo-25638: Optimized ElementTree.iterparse(); it is now 2x faster.
https://hg.python.org/cpython/rev/dd67c8c53aea
serhiy-storchaka commentedon Dec 7, 2015
The iterparse benchmark in 3.6 still is 30% slower than in 2.7. The parse benchmark is 70% slower. Hence there are other causes of the slowing down.
One of causes is that in 3.x an empty dict instead of None is passed to start handler as attrib parameter if the start tag has no attributes. This makes parsing parsing about 10% slower.
serhiy-storchaka commentedon Dec 9, 2015
Following patch speeds up ElementTree parsing (the result of the etree parse benchmark is improved by 10%). Actually it restores 2.7 code and avoids creating an empty dict for attributes if not needed.
python-dev commentedon Dec 10, 2015
New changeset 1fe904420c20 by Serhiy Storchaka in branch 'default':
Issue bpo-25638: Optimized ElementTree parsing; it is now 10% faster.
https://hg.python.org/cpython/rev/1fe904420c20
serhiy-storchaka commentedon Dec 10, 2015
Thank you for your review Brett. Now the parse benchmark in 3.6 is only 50% slower than in 2.7. Will continue to find bottlenecks.
serhiy-storchaka commentedon Mar 12, 2016
I am not able to find the cause of the slowdown.
I think this issue can be closed now. The etree_parse and etree_iterparse benchmarks are working appropriately and showing real regression in CPython 3.x. The cause of the regression is not known.