開発中の Web サービス用にリアルタイムで解析する必要がある XML ドキュメント (1.5MB) があります。この投稿によると、Python で XML を解析するための推奨される方法である cElementTree Python ライブラリを使用していますが、これが実際に最速の方法であるかどうかはわかりません。
サーバーのメモリ使用量を最小限に抑えるだけでなく、解析のパフォーマンスを向上させたいと考えており、現在ET.iterparse()を使用して SAX アプローチをテストしています。私のベンチマークは、同じ XML ドキュメントを 200 回純粋に解析した場合の次の結果を示しています。
- ET.XML ()を使用した DOM : 20.5 秒
- ET.iterparse ()を使用した SAX : 32.4 秒
これは、DOM で約102 ミリ秒、 SAXで XML 文書ごとに 162 ミリ秒に相当します。
ただし、私のアプリケーションではパフォーマンスとメモリの両方が重要であるため、SAX アプローチからより多くのパフォーマンスを絞り出して DOM の 102 ミリ秒に匹敵するか、あるいはさらに高速化したいと考えています。
以下のコードのような SAX 解析の一般的な方法の 1 つを使用しています。
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