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

Sam*_*m P 10 python xml parsing lxml urllib2

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

方法1 - 直接从链接解析

from lxml import etree as ET

parsed = ET.parse(url_link)
Run Code Online (Sandbox Code Playgroud)

方法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
Run Code Online (Sandbox Code Playgroud)

或者是否有比这些方法更有效的方法,例如将xml保存到桌面上的.xml文件然后从那些解析?

Sam*_*m P 8

我用一个简单的计时说唱歌手跑了两个方法.

方法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()
Run Code Online (Sandbox Code Playgroud)

平均值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()
Run Code Online (Sandbox Code Playgroud)

平均值100 = 286.9630毫秒

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

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