2012-06-28 107 views
2

在回答另一個問題時,有人給我看了下面的教程,其中作者聲稱使用了iterparse來解析〜100 MB的XML文件中的不足3秒:ElementTree iterparse需要多長時間?

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 

它走大約三十數秒量級的報告中所教程中,我讀使用同樣大小的文件甚至沒有相同的順序,一個類似的算法和相同的包。

有人能告訴我什麼可能是我的代碼錯誤,或者我可能不會注意到我的情況和教程之間的區別?

我正在使用Python 2.7.3。

附錄:

我也是用相當強大的機器,如果有人認爲這可能是它。

+1

我不認爲有由大小比較單獨的XML文件太大的價值。我相信那裏面的內部結構因素是複雜的。 – TJD

+0

有多少產量?顯示輸出速度驚人地慢。 –

+0

那麼在我的代碼片段中,顯然沒有任何東西(它仍然需要很長時間才能運行),但在代碼中我實際上正在嘗試使用,我禁用了所有輸出(特別是查看是否會減慢它)。事實並非如此。 – russell

回答

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