[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