2014-04-01 3 views
8

lxml.etree पायथन फ्रेमवर्क के साथ, क्या यह एक एक्सएमएल फ़ाइल को सीधे किसी लिंक से एक्सएमएल को पार्स करने के लिए अधिक कुशल है या यह कहना बेहतर है कि एक स्ट्रिंग लौटने के लिए एक अलग ढांचे (जैसे urllib2) का उपयोग करें और फिर उस से पार्स करें ? या क्या इससे कोई फर्क नहीं पड़ता?पायथन lxml.etree - क्या स्ट्रिंग या सीधे लिंक से एक्सएमएल को पार्स करना अधिक प्रभावी है?

विधि 1 - लिंक

से सीधे पार्स
from lxml import etree as ET 

parsed = ET.parse(url_link) 

विधि 2 - स्ट्रिंग से पार्स

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 

या वहां इनमें से, उदाहरण के लिए या तो की तुलना में अधिक प्रभावी तरीका है xml को डेस्कटॉप पर .xml फ़ाइल में सहेजें, फिर उनसे पार्स करें?

उत्तर

7

मैंने एक साधारण समय रैपर के साथ दो विधियों को चलाया।

विधि 1 - एक्सएमएल पार्स सीधे लिंक से

from lxml import etree as ET 

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

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

100 की औसत = 98.4035 एमएस

विधि 2 - स्ट्रिंग से एक्सएमएल तक 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() 

100 की औसत पार्स = 286.9 630 एमएस

तो अजीब बात यह है कि एलसीएमएल का उपयोग करके पार्सल का उपयोग करना लिंक से ctly अधिक त्वरित त्वरित विधि है। यह स्पष्ट नहीं है कि डाउनलोड करने के लिए तेज़ होगा, फिर हार्ड ड्राइव से बड़े एक्सएमएल दस्तावेजों को पार्स करें, लेकिन संभावित रूप से जब तक कि दस्तावेज़ बहुत बड़ा न हो और पार्सिंग कार्य अधिक गहन हो, parseXMLFromLink() फ़ंक्शन अभी भी तेज़ रहेगा क्योंकि यह urllib2 है जो धीमा लगता है दूसरा कार्य नीचे।

मैंने इसे कुछ बार भाग लिया और परिणाम वही रहे।

-1

यदि 'प्रभावी' से आपका मतलब 'कुशल' है, तो मैं अपेक्षाकृत निश्चित हूं कि आप दोनों के बीच कोई अंतर नहीं देखेंगे (जब तक ET.parse(link) बहुत लागू नहीं किया जाता है)।

कारण यह है कि नेटवर्क समय एक ऑनलाइन एक्सएमएल फ़ाइल को पार्स करने का सबसे महत्वपूर्ण हिस्सा होने जा रहा है, फ़ाइल को डिस्क में संग्रहीत करने या स्मृति में रखने से काफी लंबा है, और वास्तव में इसे पार्स करने से काफी लंबा है।

संबंधित मुद्दे