Скорость разбора xml документа (xml yandex) различными способами

Автор: Igor Kirsanov

Простая задача, нужно получить список доменов из xml документа отданного сервисом xml.yandex.ru

Сравнивалось решение простой задачи с помощью разбора универсальным инструментом ElemetTree и регулярным выражением


#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import xml.etree.ElementTree as ET  #подключаем библиотеку XML
 
def foo1():
    tree = ET.parse("test.xml") #открываем xml документ
    for node in tree.iter('domain'): # получаем все элементы со значением тега domain
        node.text # получаем текст ноды
 
def foo2(): 
    tree = ET.parse("test.xml") # открываем тестовый xml 
    root = tree.findall("response/results/grouping/group/doc/domain") #определяем xpath
    for child in root: # проходим все дочерние элементы
        child.text # получаем текст
 
import re
def foo3():
    f = open("test.xml") # стандартное чтение
    data = f.read() # преобразуем в читаемый вид
    # находим регулярным выражением все значения внутри тега domain
    re.findall(r'(.*?)', data, re.DOTALL) 
 
# профилирование
import cProfile
cProfile.run('foo1()')
cProfile.run('foo2()')
cProfile.run('foo3()')

вывод на экран убран, так как замедляет итоговые функции.
Результаты:


         71121 function calls (67801 primitive calls) in 0.411 seconds
 
         69836 function calls (69628 primitive calls) in 0.377 seconds
 
         317 function calls (309 primitive calls) in 0.003 seconds
На такой простой задаче регулярные выражения уверено лидируют.