سؤال

لدي بعض مستندات XML التي أحتاجها لتشغيل الاستعلامات عليها. لقد قمت بإنشاء بعض البرامج النصية Python (باستخدام ElementTree) للقيام بذلك ، لأنني على دراية غامضة باستخدامه.

الطريقة التي تعمل بها هي أن أقوم بتشغيل البرامج النصية عدة مرات بحجج مختلفة ، اعتمادًا على ما أريد اكتشافه.

يمكن أن تكون هذه الملفات كبيرة نسبيًا (10 ميجابايت+) وبالتالي يستغرق وقتًا طويلاً لتحليلها. على نظامي ، فقط التشغيل:

tree = ElementTree.parse(document)

يستغرق حوالي 30 ثانية ، مع استفسار Findall اللاحق فقط يضيف حوالي ثانية إلى ذلك.

نظرًا لأن الطريقة التي أفعل بها هذا يتطلب مني تحليل الملف مرارًا وتكرارًا ، كنت أتساءل عما إذا كان هناك نوع من آلية التخزين المؤقت التي يمكنني استخدامها بحيث يمكن تقليل حساب elementTree.Parse عند الاستعلامات اللاحقة.

أدرك أن الشيء الذكي الذي يجب القيام به هنا قد يكون محاولة دفع أكبر عدد ممكن من الاستعلامات معًا في نص Python ، لكنني كنت آمل أن يكون هناك طريقة أخرى.

شكرًا.

هل كانت مفيدة؟

المحلول

على الرغم من أنني الثاني في الاقتراح لاستخدام LXML ، يمكنك الحصول على دفعة كبيرة في الأداء باستخدام CelementTree المدمج.

from xml.etree import cElementTree as ElementTree

نصائح أخرى

بعد أن انبع توصية LXML ، انظر إلى هذا مقالة - سلعة لكيفية تحسين الأداء باستخدام طريقة التحليل التكرارية (SAX-like). يمكن أن يكون ألمًا في البداية لأنه يمكن أن يتحول إلى إجرائي وفوضوي حقًا ، لكنه يجعل الأمور أسرع. كما ترون من هذه المعايير, ، على الأرجح LXML أفضل رهان على الأداء.

أولاً ، فكر في استخدام lxml بداية شئ ElementTree:
http://lxml.de/هذا غلاف لـ libxml2 ، والذي أجده يؤدي بشكل جيد.

قم بتشغيل Python بشكل تفاعلي ، وقم بإجراء استعلامات متعددة ضد نفس كائن Etree. ipython هو مترجم بيثون تفاعلي معزز مع سهولة الوصول إلى الاستبطان و syntax الراحة.

على سبيل المثال الفحص بشكل تفاعلي note.xml مع Ipython باستخدام 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>]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top