Python lxml.etree - 从字符串或直接从链接解析XML更有效吗?

时间:2014-04-01 18:22:02

标签: python xml parsing urllib2 lxml

使用lxml.etree python框架,直接从链接到在线xml文件解析xml是否更有效,或者更好地说,使用不同的框架(例如urllib2),返回一个字符串,然后解析?或者它没有任何区别?

方法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文件,然后从那些解析?

2 个答案:

答案 0 :(得分:7)

我用一个简单的计时说唱歌手来运行这两种方法。

方法1 - 直接从链接解析XML

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返回的字符串中解析XML

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.9630毫秒

所以有趣的是,似乎使用lxml直接从链接解析是更快速的方法。目前尚不清楚下载是否会更快从硬盘驱动器解析大型xml文档,但可能除非文档很大并且解析任务更加密集,parseXMLFromLink()函数仍然会更快urllib2似乎减慢了第二个功能。

我跑了几次,结果保持不变。

答案 1 :(得分:-1)

如果'有效'意味着'有效',我相对肯定你会发现两者之间没有差别(除非ET.parse(link)被严重执行)。

原因是网络时间将是解析在线XML文件的最重要部分,比将文件存储到磁盘或将其保留在内存中要长得多,并且比实际解析它要长很多。 / p>