Скорость разбора xml документа (xml yandex) различными способами
Простая задача, нужно получить список доменов из 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'<domain>(.*?)</domain>', 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
На такой простой задаче регулярные выражения уверено лидируют.