Frage

Ich habe einige XML -Dokumente, auf denen ich Abfragen ausführen muss. Ich habe dazu einige Python -Skripte (mit ElementTree) erstellt, da ich mit der Verwendung vage vertraut bin.

Die Art und Weise, wie es funktioniert, ist, dass ich die Skripte mehrmals mit unterschiedlichen Argumenten ausführe, je nachdem, was ich herausfinden möchte.

Diese Dateien können relativ groß sein (10 MB+) und es dauert daher ziemlich lange, um sie zu analysieren. Auf meinem System, einfach rennen:

tree = ElementTree.parse(document)

dauert ungefähr 30 Sekunden, wobei eine nachfolgende Findall -Abfrage nur eine Sekunde hinzufügt.

Als ich dies mache, muss ich die Datei wiederholt analysieren, und ich habe mich gefragt, ob es einen Caching -Mechanismus gab, den ich verwenden kann, damit die ElementTree.Parse -Berechnung bei nachfolgenden Abfragen reduziert werden kann.

Mir ist klar, dass das Kluge hier sein könnte, so viele Abfragen wie möglich zusammen im Python -Skript zu batchieren, aber ich hoffte, dass es möglicherweise einen anderen Weg geben könnte.

Vielen Dank.

War es hilfreich?

Lösung

Während ich den Vorschlag zur Verwendung von LXML zweite, können Sie mit dem gebauten Celementtree einen enormen Leistungsschub erhalten.

from xml.etree import cElementTree as ElementTree

Andere Tipps

Wenn Sie die LXML -Empfehlung sekundieren, sehen Sie sich diese an Artikel So verbessern Sie die Leistung mit einer iterativen (Sax-ähnlichen) Parsingmethode. Es kann zunächst ein Schmerz sein, da es wirklich prozedural und chaotisch werden kann, aber es macht die Dinge schneller. Wie siehst du aus Diese Benchmarks, LXML ist höchstwahrscheinlich die beste Wahl für die Leistung.

Zunächst einmal überlegen, die zu verwenden lxml Implementierung von ElementTree:
http://lxml.de/Dies ist ein Wrapper für libxMl2, den ich gut erbringt.

Führen Sie Python interaktiv aus und machen Sie mehrere Abfragen gegen dasselbe E -E -Objekt. ipython ist ein verbesserter interaktiver Python-Dolmetscher mit einfachem Zugang zu Selbstbeobachtung und Bequemlichkeitssyntax.

ZB interaktiv untersucht Anmerkung.xml mit ipython verwenden 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>]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top