[python-nl] gnosis.xml.objectify

Martijn Pieters mj at python.org
Sun Feb 19 22:50:36 CET 2006


UnrealEd wrote:
> ik ben samen met een vriend een socket aan het schrijven, waarbij we de data
> doorsturen in xml-formaat. Ik ben daarom begonnen met het schrijven van een
> XML reader class, gebruik makend van de xml.minidom. Nu las ik op deze
> website ( http://www-128.ibm.com/developerworks/library/x-matters28/ ) dat
> de gnosis xml class veel sneller te werk gaat in het processen van xml data.

Enkele observaties (met excuses voor het gebrek aan een coherent verhaal):

- Optimaliseer alleen wanneer nodig; laat je niet leiden door problemen
   die er (nog) niet zijn. Gemak van ontwikkeling en onderhoud zijn
   belangrijker, en je zult zien dat werkelijke performance problemen
   makkelijker op te lossen zijn wanneer je code goed in elkaar zit.
   Premature optimalisatie echter, leidt gemakkelijk tot meer problemen.

- Benchmarks geven nooit een goed beeld van hoe een library in *jouw*
   applicatie presteerd. Als XML performance een bottleneck is, doe je
   eigen tests. De IT wereld kent zijn eigen gezegden, en 'Lies, damn
   lies and benchmarks' is daar één van. Bovendien is David Mertz'
   artikel al weer 3 jaar oud; er is veel veranderd in Python XML land
   sinds hij dat schreef.

- Er zijn twee manieren om met XML om te gaan: als een event stream en
   als een boom. SAX parsers en dergelijke geven je een event stream
   ('start element', 'end element', enz.). Een DOM tree is een voorbeeld
   van de boom benadering.

   Tenzij je absoluut een boom nodig hebt, raad ik je aan een event
   stream benadering te gebruiken omdat dat sneller is en minder geheugen
   kost; een boom implementatie gebruikt teslotte zelf al een event
   stream om de boom in het geheugen op te bouwen. Gebruik alleen een
   boom indien je arbitraire toegang tot de XML gegevens nodig hebt.

   Let wel, ik zou zelf voor ElementTree of lxml kiezen tenzij ik sterke
   indicaties had dat geheugen of snelheid van belang zouden zijn; gemak
   van ontwikkeling en leesbaarheid telt zwaar.

- W3C DOM is een verschrikkelijke interface, welke is ontworpen voor
   talen die veel rigider zijn dan Python (namelijk C++ en Java). Tenzij
   je de DOM ook naar externe niet-python omgevingen exporteert, is er
   geen enkele reden om die interface te gebruiken. Doe jezelf een
   plezier en gebruik ElementTree of lxml; pythonische interfaces voor
   de XML document boom.

- Minidom een pure Python DOM implementatie, en implementeert slechts
   een subset van DOM level 2. Het is niet moeilijk om sneller en beter
   te zijn dan minidom.

- ElementTree heeft een C implementatie voor snelheid, en lxml is al
   in pyrex (compileert naar C), test welke library sneller is (zie
   eerdere opmerkingen over benchmarks).

- Vanaf python 2.5 is ElementTree onderdeel van de standaard python
   library.

Martijn Pieters


More information about the Python-nl mailing list