Неоднократно запрашивая XML с помощью Python - PullRequest
1 голос
/ 24 марта 2010

У меня есть несколько XML-документов, по которым мне нужно выполнять запросы. Я создал несколько сценариев Python (используя ElementTree) для этого, так как я смутно знаком с его использованием.

Как это работает, я запускаю сценарии несколько раз с разными аргументами, в зависимости от того, что я хочу выяснить.

Эти файлы могут быть относительно большими (10 МБ +), поэтому для их анализа требуется довольно много времени. На моей системе просто запущено:

tree = ElementTree.parse(document)

занимает около 30 секунд, а последующий запрос findall прибавляет к этому примерно секунду.

Видя, что для этого необходимо, чтобы я неоднократно анализировал файл, мне было интересно, есть ли какой-нибудь механизм кэширования, который я могу использовать, чтобы вычисление ElementTree.parse можно было уменьшить при последующих запросах. *

Я понимаю, что разумно было бы попытаться объединить как можно больше запросов в скрипте python, но я надеялся, что может быть другой путь.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 24 марта 2010

Хотя я и предлагаю использовать lxml, вы можете значительно повысить производительность, используя встроенное cElementTree.

from xml.etree import cElementTree as ElementTree
1 голос
/ 24 марта 2010

После рекомендации lxml, посмотрите в этой статье , как повысить производительность с помощью итеративного (SAX-подобного) метода синтаксического анализа. Поначалу это может быть болезненно, поскольку это может стать действительно процедурным и грязным, но это ускоряет процесс. Как видно из этих тестов , lxml, скорее всего, является лучшим выбором для производительности.

1 голос
/ 24 марта 2010

Прежде всего, рассмотрите возможность использования lxml реализации ElementTree:
http://lxml.de/ Это оболочка для libxml2, которая, на мой взгляд, работает хорошо.

Запустите python в интерактивном режиме, сделайте несколько запросов к одному и тому же объекту etree. ipython - это улучшенный интерактивный интерпретатор Python с легким доступом к самоанализу и удобному синтаксису.

например. интерактивное изучение note.xml с помощью ipython с использованием lxml.etree.

$ ipython
Python 2.5.1 (r251:54863, Jul 10 2008, 17:24:48)
Type "copyright", "credits" or "license" for more information.

IPython 0.8.2 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object'. ?object also works, ?? prints more.

In [1]: from lxml import etree

In [2]: doc = etree.parse(open("note.xml"))

In [3]: etree.dump(doc.getroot())
<note>
        <to>Tove</to>
        <from>Jani</from>
        <heading>Reminder</heading>
        <body>Don't forget me this weekend!</body>
</note>
In [4]: doc.xpath('/note/*')
Out[4]:
[<Element to at 89cf02c>,
 <Element from at 89cf054>,
 <Element heading at 89cf07c>,
 <Element body at 89cf0a4>]
...