2010-03-24 61 views
1

我有一些xml文檔需要運行查詢。我已經創建了一些python腳本(使用ElementTree)來做到這一點,因爲我對使用它非常熟悉。使用python重複查詢xml

它的工作原理是我使用不同的參數運行腳本幾次,這取決於我想找到出路。

這些文件可能相對較大(10MB +),所以它需要相當長的時間來分析它們。在我的系統上,剛剛運行:

tree = ElementTree.parse(document) 

大約需要30秒,隨後的findall查詢只增加了大約一秒。

看到我這樣做的方式需要我反覆解析文件,我想知道是否有某種緩存機制可以使用,這樣可以減少後續查詢中的ElementTree.parse計算。

我知道聰明的做法,在這裏做可能會嘗試在python腳本批量儘可能多的查詢儘可能在一起,但我希望有可能是另一種方式。

謝謝。

回答

3

雖然我第二個建議使用lxml,你可以通過使用內置的cElementTree獲得巨大的性能提升。

from xml.etree import cElementTree as ElementTree 
+0

是的,我認爲這將工作!第一次運行查詢需要大約15秒,但隨後的查詢大約需要1-2秒。 至於使用LXML我的理由不這樣做,我希望確保這些腳本會制定出我運行它們在任何MAC的方塊,而無需安裝任何軟件。我不知道是否有一種方法可以構建lxml,只需將它與我的.py文件捆綁在一起,如果有,請讓我知道我是如何做到的 – 2010-03-24 14:03:53

1

首先,考慮使用的ElementTreelxml實現:
http://lxml.de/ 這是libxml2的包裝,我覺得表現良好。

運行Python交互方式,使得對同一etree對象多個查詢。 ipython是一款增強型交互式Python解釋器,可輕鬆訪問內省和便捷語法。

E.g.使用lxml.etree與ipython交互式檢查note.xml

$ ipython 
Python 2.5.1 (r251:54863, Jul 10 2008, 17:24:48) 
Type "copyright", "credits" or "license" for more information. 

IPython 0.8.2 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object'. ?object also works, ?? prints more. 

In [1]: from lxml import etree 

In [2]: doc = etree.parse(open("note.xml")) 

In [3]: etree.dump(doc.getroot()) 
<note> 
     <to>Tove</to> 
     <from>Jani</from> 
     <heading>Reminder</heading> 
     <body>Don't forget me this weekend!</body> 
</note> 
In [4]: doc.xpath('/note/*') 
Out[4]: 
[<Element to at 89cf02c>, 
<Element from at 89cf054>, 
<Element heading at 89cf07c>, 
<Element body at 89cf0a4>] 
+0

一個偉大的建議,但不知道它會爲我工作,我其實是想從運行一個AppleScript的Python腳本。我會看看我是否可以使它工作 – 2010-03-24 13:54:21

1

借調的lxml的建議,看看這個article如何通過使用迭代(SAX-等)分析方法,以提高性能。起初它可能是一種痛苦,因爲它可以變成真正的程序性和混亂性,但它使事情變得更快。從these benchmarks可以看出,lxml很可能是您表現最好的選擇。

+0

+1有趣的文章 – MattH 2010-03-24 14:19:54