Python中SAX解析的最快方法

Python中SAX解析的最快方法,python,xml,xml-parsing,sax,celementtree,Python,Xml,Xml Parsing,Sax,Celementtree,我有一个XML文档(1.5MB),需要为我正在开发的web服务实时解析它。我使用的是cElementTree Python库,根据这一点,它是Python中解析XML的首选方法,但我不确定这是否是最快的方法 我希望提高解析性能,同时尽量减少服务器上的内存使用,目前正在使用ET.iterparse()测试SAX方法。我的基准测试显示了对同一XML文档进行200次纯解析的以下结果 具有ET.XML()的DOM:20.5s 带有ET.iterparse()的SAX:32.4s 这大致相当于DOM的

我有一个XML文档(1.5MB),需要为我正在开发的web服务实时解析它。我使用的是cElementTree Python库,根据这一点,它是Python中解析XML的首选方法,但我不确定这是否是最快的方法

我希望提高解析性能,同时尽量减少服务器上的内存使用,目前正在使用ET.iterparse()测试SAX方法。我的基准测试显示了对同一XML文档进行200次纯解析的以下结果

  • 具有ET.XML()的DOM:20.5s
  • 带有ET.iterparse()的SAX:32.4s
这大致相当于DOM的102ms,而SAX每XML文档的162ms

但是,我仍然希望从SAX方法中挤出更多的性能来匹配102ms的DOM,或者可能更快,因为性能和内存在我的应用程序中都是至关重要的

我正在使用一种常见的SAX解析方法,如下所示:

from cStringIO import StringIO
import xml.etree.cElementTree as ET

def parse(xml_string):  
    result = []
    io = StringIO(xml_string)
    context = ET.iterparse(io, events=("start", "end"))
    for event, elem in context:
        tag = elem.tag
        value = elem.text

        if event == 'end':
            # get value from element and add to result[]
            pass

            elem.clear()

    return result

我希望在我的应用程序中不断解析类似大小的XML。应用程序不断地查询外部web服务(一次可以查询10-15个,而且这个数字还在增长)并返回XML文档。由于应用程序可能由许多不同的用户同时使用,随着我向应用程序添加更多外部web服务和用户,驻留在内存中的XML文档数量可能会增加。我的想法是希望从长远来看节省内存。是的,不幸的是,在我的例子中使用
fast\u iter
lxml
实际上会将其速度降低到39秒左右。。。我会尝试其他方法,看看我是否能比我现有的更好。