Как правило, я бы предложил использовать ElementTree's iterparse
или, в качестве дополнительной скорости, его аналог из lxml . Также попробуйте использовать Обработка (поставляется с 2.6) для распараллеливания.
Важной особенностью iterparse
является то, что вы получаете элемент (под) структуры при их разборе.
import xml.etree.cElementTree as ET
xml_it = ET.iterparse("some.xml")
event, elem = xml_it.next()
event
всегда будет строкой "end"
в этом случае, но вы также можете инициализировать синтаксический анализатор, чтобы также сообщать вам о новых элементах при их разборе. У вас нет никаких гарантий, что все дочерние элементы будут проанализированы в этот момент, но атрибуты есть, если вас это только интересует.
Еще один момент заключается в том, что вы можете прекратить чтение элементов из итератора на ранней стадии, то есть до того, как весь документ будет обработан.
Если файлы большие (они?), Существует общая идиома, позволяющая поддерживать постоянную загрузку памяти, как в потоковом парсере.