2012-06-28 3 views
2

Отвечая на другой вопрос, кто-то показал мне следующее учебник, в котором автор утверждает, что использовал iterparse разобрать MB XML ~ 100 файлов менее чем за 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 только может быть не очень информативным. Тем не менее, я, случается, есть файлы той же структуры, но различный размер:

С в 79м файл:

$ 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.8gtimeit выход:

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

Смежные вопросы