Domanda

Ho alcuni documenti XML ho bisogno di eseguire query su. Ho creato alcuni script python (utilizzando ElementTree) per fare questo, dal momento che sono vagamente familiare con l'utilizzo di esso.

Il modo in cui funziona è che eseguire gli script più volte con argomenti diversi, a seconda di quello che voglio scoprire.

Questi file possono essere relativamente grande (10 MB +) e quindi ci vuole un po 'molto tempo per analizzare loro. Sul mio sistema, solo in esecuzione:

tree = ElementTree.parse(document)

richiede circa 30 secondi, con una successiva richiesta findall aggiungendo soltanto intorno ad un secondo a quello.

Visto che il modo in cui sto facendo questo mi impone di analizzare più volte il file, mi chiedevo se ci fosse una sorta di meccanismo di caching che posso utilizzare in modo che il calcolo ElementTree.parse può essere ridotta sulla query successive.

Mi rendo conto che la cosa più intelligente da fare qui può essere quello di cercare di batch come molte domande come possibile insieme nello script python, ma speravo ci potrebbe essere un altro modo.

Grazie.

È stato utile?

Soluzione

Mentre secondo il suggerimento di utilizzare lxml, è possibile ottenere un enorme incremento delle prestazioni utilizzando la cElementTree incorporato.

from xml.etree import cElementTree as ElementTree

Altri suggerimenti

Assecondare lo raccomandazione lxml, guardare a questo per come migliorare le prestazioni utilizzando un metodo di analisi (SAX-like) iterativo. Può essere un dolore in un primo momento dal momento che può trasformare in realtà procedurale e disordinato, ma rende le cose più velocemente. Come si può vedere da questi benchmark , lxml è più probabile che la soluzione migliore per le prestazioni.

Prima di tutto, è consigliabile utilizzare l'attuazione lxml di ElementTree:
http://lxml.de/ Questo è un wrapper per libxml2, che trovo si comporta bene.

Esegui pitone in modo interattivo, rendono più query contro lo stesso oggetto eTree. ipython è una migliore interprete Python interattiva con facile accesso alla introspezione e la convenienza-sintassi.

es. interattivamente esaminare note.xml con ipython utilizzando 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>]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top