2017-02-10 5 views
0

現在、ElementTreeを使用して何千ものオブジェクトが含まれているXMLファイルを解析しています。 XMLはこのようになります(注:数千のオブジェクトがあります):Python:Element Treeを使った効率的なXMLルックアップ

def objattribs(objname,objects): 
    for o in objects: 
      name = o.find('./Name').text 
      if name = objname: 
       'do something' 
objname = 'SomeObject' 
objects = objects_XML.findall('./object') 
objattribs(objname,objects) 

私がいる問題があることである:

<objects> 
    <object> 
     <Name> Name 1 </Name> 
     <attrib1> Attrib1 </attrib1> 
     <attrib2> Attrib2 </attrib2> 
    </object> 
</objects> 

私が何をやったかは、次のように関数を作成していますこの作品は、私のコードは、そのXMLですべてのオブジェクトの名前を見つけるため、非常に遅い実行する原因になっている:

name = o.find('./Name').text 

は、この操作を行うと、私のプログラムをスピードアップするためのより良い方法はありますか? ElementTreeのでサポートされているよう

+0

あなたは、ドットスラッシュなしでちょうどo.find(「名前」)テキストを、試したことがありますか? Findはタグ名またはパスに一致することができます。タグ名を使用できるパスを使用しています。これは高速かもしれません。 – jimhark

答えて

1

は、XPathを使用してみてください:

xml<objects>を表す xml.etree.ElementTree.Elementある
def find_by_name(name, xml): 
    return xml.findall("./object[Name='%s']" % name) 

。あなたは10'000 <object>子要素で、上記の構造のXMLドキュメントのために私は、この結果を得る:。

In [27]: %timeit find_by_name(' Name 8888 ', x) 
100 loops, best of 3: 8.73 ms per loop 
+0

これを使って実行時間を8.7秒から2.4秒に短縮できました! – tlserror

+0

聞いてうれしい!もし私が最大限のパフォーマンスを得ていれば、私は通常、ElementTreeの代わりにlxmlを使用します。しかし、それは標準ライブラリの一部ではありません。 – dnswlt

関連する問題