ElementTree iterparse需要多长时间?

时间:2012-06-28 18:41:27

标签: python xml iterparse celementtree

在回答另一个问题时,有人向我展示了以下教程,其中作者声称使用iterparse在3秒内解析了一个~100 MB的XML文件:

http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python-with-elementtree/

我正在尝试解析一个~90 MB的XML文件,我有以下代码:

from xml.etree.cElementTree import *
count = 0

for event, elem in iterparse('foo.xml'):        
    if elem.tag == 'identifier' and elem.text == 'bar':
        count += 1
    elem.clear() # discard the element

print count

大约需要30秒......甚至与我使用类似大小的文件,类似算法和相同包中阅读的教程中报告的数量级相同。

有人可以告诉我我的代码可能有什么问题,或者我的情况和教程之间可能没有注意到哪些差异?

我正在使用Python 2.7.3。

附录:

我也在使用功能相当强大的机器,万一有人认为可能就是这样。

1 个答案:

答案 0 :(得分:4)

正如TJD所提到的,只比较大小的XML可能不是很有用。但是,我碰巧有相同结构但大小不同的文件:

使用79M文件:

$ python -m timeit -n 1 -c 'from xml.etree.cElementTree import iterparse
count = 0
for event, elem in iterparse("..../QT20060217_S_18mix23-2500_01.mzML"):
    if elem.tag.endswith("spectrum"): count += 1
    elem.clear()
print count'
6126
6126
6126
1 loops, best of 3: 950 msec per loop

使用3.8G文件时,timeit输出为:

1 loops, best of 3: 22.3 sec per loop

另外,与lxml进行比较:将第一行中的xml.etree.cElementTree更改为lxml.etree我得到:

表示第一个文件:730 msec per loop

表示第二个文件:11.4 sec per loop