2014-04-01 16 views
8

Con il framework python lxml.etree, è più efficiente analizzare xml direttamente da un collegamento a un file xml online o è meglio dire, utilizzare un framework diverso (come urllib2), per restituire una stringa e quindi analizzare da quella ? O non fa alcuna differenza?Python lxml.etree - È più efficace analizzare XML da string o direttamente dal link?

Metodo 1 - Parse direttamente dal collegamento

from lxml import etree as ET 

parsed = ET.parse(url_link) 

Metodo 2 - Parse da stringa

from lxml import etree as ET 
import urllib2 

xml_string = urllib2.urlopen(url_link).read() 
parsed = ET.parse.fromstring(xml_string) 

# note: I do not have access to python 
# at the moment, so not sure whether 
# the .fromstring() function is correct 

O c'è un metodo più efficiente di uno di questi, ad esempio salvare l'xml in un file .xml sul desktop, quindi analizzare da quelli?

risposta

7

Ho eseguito i due metodi con un rapper di temporizzazione semplice.

Metodo 1 - Analizzare XML direttamente dal link

from lxml import etree as ET 

@timing 
def parseXMLFromLink(): 
    parsed = ET.parse(url_link) 
    print parsed.getroot() 

for n in range(0,100): 
    parseXMLFromLink() 

media di 100 = 98,4035 ms

Metodo 2 - Analizzare XML da stringa restituita da urllib2

from lxml import etree as ET 
import urllib2 

@timing 
def parseXMLFromString(): 
    xml_string = urllib2.urlopen(url_link).read() 
    parsed = ET.fromstring(xml_string) 
    print parsed 

for n in range(0,100): 
    parseXMLFromString() 

media di 100 = 286.9630 ms

Quindi, aneddoticamente, sembra che usare lxml per analizzare dal link è il metodo più immediato. Non è chiaro se sia più veloce da scaricare e quindi analizzare documenti xml di grandi dimensioni dal disco rigido, ma presumibilmente a meno che il documento non sia enorme e l'attività di analisi più intensiva, la funzione parseXMLFromLink() rimarrebbe più veloce in quanto è urllib2 che sembra rallentare seconda funzione in basso.

L'ho eseguito alcune volte ei risultati sono rimasti gli stessi.

-1

Se per "efficace" si intende "efficiente", sono relativamente certo che non si noterà alcuna differenza tra i due (a meno che non venga implementato in modo orribile lo standard ET.parse(link)).

La ragione è che il tempo di rete sta per essere la parte più significativa di parsing di un file XML in linea, molto più a lungo di memorizzare il file su disco o mantenere in memoria, e molto più a lungo di quanto in realtà l'analisi di esso.

Problemi correlati