1

クエリを実行する必要がある xml ドキュメントがいくつかあります。私はそれを使用することに漠然と慣れているので、これを行うためにいくつかの Python スクリプト (ElementTree を使用) を作成しました。

それが機能する方法は、何を調べたいかに応じて、さまざまな引数でスクリプトを数回実行することです。

これらのファイルは比較的大きく (10MB 以上) あるため、解析にはかなり長い時間がかかります。私のシステムでは、ただ実行しています:

tree = ElementTree.parse(document)

約 30 秒かかり、その後の findall クエリでは約 1 秒しか追加されません。

私がこれを行っている方法では、ファイルを繰り返し解析する必要があるため、後続のクエリで ElementTree.parse の計算を削減できるように、使用できる何らかのキャッシュメカニズムがあるかどうか疑問に思っていました。

ここで実行する賢明な方法は、python スクリプトでできるだけ多くのクエリをまとめてバッチ処理することかもしれませんが、別の方法があることを期待していました。

ありがとう。

4

3 に答える 3

3

lxml を使用するという提案には賛成ですが、組み込みの cElementTree を使用すると、パフォーマンスが大幅に向上します。

from xml.etree import cElementTree as ElementTree
于 2010-03-24T13:48:24.870 に答える
1

lxmlまず、次の実装を使用することを検討してくださいElementTree:
http://lxml.de/ これは libxml2 のラッパーであり、パフォーマンスが良いことがわかりました。

Python をインタラクティブに実行し、同じ etree オブジェクトに対して複数のクエリを作成します。ipythonイントロスペクションと便利な構文に簡単にアクセスできる、強化されたインタラクティブな Python インタープリターです。

たとえば、 を使用してipythonで note.xml をインタラクティブに調べlxml.etreeます。

$ 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>]
于 2010-03-24T13:25:25.100 に答える
1

lxml の推奨に従って、反復 (SAX に似た) 解析方法を使用してパフォーマンスを向上させる方法については、この記事を参照してください。最初はとても手続き的で煩雑になるので面倒かもしれませんが、作業が速くなります。これらのベンチマークからわかるように、lxml がパフォーマンスの最善策である可能性が最も高いです。

于 2010-03-24T13:51:50.387 に答える