Quelle est la différence entre findall() et iterfind (), xml.programme etree.ElementTree
J'écris un programme en utilisant comme ci-dessous
from xml.etree.ElementTree import ET
xmlroot = ET.fromstring([my xml content])
for element in xmlroot.iterfind(".//mytag"):
do some thing
il fonctionne très bien sur mon python (v2.7.1), mais après je l'ai copier sur un autre ordinateur installé avec python v2.6.x, iterfind()
n'est pas pris en charge, sur python document, la description ci-dessous énumérés
findall(match)
Trouve tous les sous-éléments par tag nom ou le chemin d'accès. Retourne une liste contenant tous les éléments correspondants dans l'ordre du document.
iterfind(match)
Trouve tous les sous-éléments par tag nom ou le chemin d'accès. Retourne un objet iterable rendement de tous les éléments correspondants dans l'ordre du document.
Nouveau dans la version 2.7.
ma question est: ces 2 la fonction est la même ou pas? quelle est la différence entre ces deux fonctions
OriginalL'auteur john zhao | 2015-06-25
Vous devez vous connecter pour publier un commentaire.
Comme indiqué dans les docs -
findall retourne la liste complète des éléments correspondant à la
match
xpath , on peut utiliser des indices pour y accéder , par exemple -Nous pouvons également utiliser la boucle for pour parcourir la liste.
iterfind serait plus rapide que findall dans le cas où vous voulez vraiment pour parcourir la liste retournée(qui est la plupart du temps à partir de mon expérience) , depuis findall a pour créer la liste complète avant de revenir, alors que iterfind trouve (rendements), l'élément suivant qui correspond à la
match
seulement sur l'itération et l'appel à lanext(iter)
(qui est ce qui est appelé en interne lors d'une itération dans la liste à l'aidefor
ou de telles constructions).Dans le cas où vous voulez la liste, les Deux semblent avoir les mêmes timing.
Test de Performance pour les deux cas -
findall(...)
est mis en œuvre à l'aide delist(iterfind(...))
. (Au moins en Python 3.5)OriginalL'auteur Anand S Kumar
Si vous ne
alors les éléments seront récupérés à partir du fichier XML un à la fois (un élément par boucle).
Si vous ne
tous les éléments seront récupérées à la fois et stocké dans un (temporaire) de la liste. Alors seulement, la
for
le début de la boucle pour parcourir la liste.Cela signifie que la deuxième méthode prend plus de temps au début (parce qu'il a à construire cette liste) et utilise plus de mémoire (pour la même raison). Aussi, si vous avez besoin de sortir de la
for
boucle avant que vous avez atteint le dernier élément, vous aurez fait le travail inutile. De l'autre côté, une fois que vous êtes à l'intérieur de lafor
boucle, la seconde méthode sera probablement un peu plus rapide. Habituellement, les avantages de la première méthode ("lazy evaluation") compensent cet inconvénient.Dans votre cas, il est probablement sûr de passer à
findall
.OriginalL'auteur Tim Pietzcker
Comme dit dans votre lien iterfind retour d'un générateur (rendement) et findall revenir une liste.
La seule différence est là, vous pouvez vérifier ici par exemple, de voir la différence entre ces deux types.
C'est surtout les performances de la mémoire dans ce cas.
OriginalL'auteur Bestasttung