0

XML文字列があります

<tags>
   <person1>dave jones</person1>
   <person2>ron matthews</person2>
   <person3>sally van heerden</person3>
   <place>tygervalley</place>
   <ocassion>shopping</ocassion>
</tags>

「Sally Van Heerden」や「Tygervalley」などの検索語を使用して、この xml 文字列を検索したいと思います。

この文字列内の用語を見つけるために正規表現を使用する方が速いですか、それとも Python の find() メソッドは十分に速いですか? また、Python の要素ツリー XML パーサーを使用して検索し、XML ツリーを作成してから検索することもできますが、遅すぎるのではないかと心配しています。

上記の3つのうち、最も速いのはどれですか? また、他の提案はありますか?

4

2 に答える 2

3

答えは、検索結果をどうするかによって異なります。XML パーサーを使用しないことを検討する必要がある唯一のケースは、XML 文書の構造をあまり気にしない場合です。

この場合、3 つすべてのタイミングを試すことができますが、ツリーを構築する必要はなく、部分文字列検索と競合するのに時間がかかりすぎる可能性があります。

3 つすべての時間を計って、問題の典型的なファイルの違いを確認してください。たとえば、小さなサンプル ファイルでは次のようになります。

$ python -m timeit "any('tygervalley' in line for line in open('t.xml'))"
100000 loops, best of 3: 14.6 usec per loop

$ python -m timeit "import re" "for line in open('t.xml'):" "    re.findall('tygervalley', line)"
10000 loops, best of 3: 27.4 usec per loop


$ python -m timeit "from lxml.etree import parse" "tree = parse('t.xml')" "tree.xpath('//*[text()=\'tygervalley\']')"
10000 loops, best of 3: 133 usec per loop

呼び出す実際のメソッドをいじることができます。常に選択肢があります。

編集: 100 倍長いファイルで状況がどのように変化するかに注意してください:

$ python -m timeit "any('tygervalley' in line for line in open('t.xml'))"
100000 loops, best of 3: 20.8 usec per loop

$ python -m timeit "import re" "for line in open('t.xml'):" "    re.findall('tygervalley', line)"
1000 loops, best of 3: 252 usec per loop

$ python -m timeit "from lxml.etree import parse" "tree = parse('t.xml')" "tree.xpath('//*[text()=\'tygervalley\']')"
1000 loops, best of 3: 1.34 msec per loop

結果の解釈には注意してください:)

于 2012-05-18T09:04:18.690 に答える
0

大きくないxmlファイルについてregexpとlxmlを比較しようとしましたが、大きな違いはありませんでした。

于 2012-05-18T08:47:22.313 に答える