我用下面的方法写了一个程序
from xml.etree.ElementTree import ET
xmlroot = ET.fromstring([my xml content])
for element in xmlroot.iterfind(".//mytag"):
do some thing
它在我的 python (v2.7.1) 上工作正常,但在我将它复制到另一台安装了 python v2.6.x 的计算机后,不支持 iterfind()
,在 python document , 下面列出了描述
findall(match)
Finds all matching subelements, by tag name or path. Returns a list containing all matching elements in document order.
iterfind(match)
Finds all matching subelements, by tag name or path. Returns an iterable yielding all matching elements in document order.
New in version 2.7.
我的问题是:这两个功能是否相同?这两个函数有什么区别
最佳答案
如文档中所示 -
findall 返回匹配
match
的元素的完整列表xpath,我们可以使用下标来访问它们,例如->>> root = ET.fromstring("<a><b>c</b></a>") >>> root.findall("./b") [<Element 'b' at 0x02048C90>] >>> lst = root.findall("./b") >>> lst[0] <Element 'b' at 0x02048C90>
我们还可以使用 for 循环来遍历列表。
- iterfind 返回的是迭代器(generator),它不返回列表,这种情况下我们不能使用下标访问元素,只能在接受迭代器的地方使用,一个示例将在 for 循环中。
iterfind 在您实际上想要遍历返回列表的情况下会比 findall 更快(根据我的经验,这是大部分时间),因为 findall 必须在返回之前创建完整的列表,而 iterfind 查找(产量)与 match
匹配的下一个元素仅在迭代时调用 next(iter)
(这是在使用 for
或此类构造遍历列表时内部调用的内容)。
在您需要列表的情况下,两者的时间安排似乎相似。
两种情况的性能测试-
In [1]: import xml.etree.ElementTree as ET
In [2]: x = ET.fromstring('<a><b>c</b><b>d</b><b>e</b></a>')
In [3]: def foo(root):
...: d = root.findall('./b')
...: for y in d:
...: pass
...:
In [4]: def foo1(root):
...: d = root.iterfind('./b')
...: for y in d:
...: pass
...:
In [5]: %timeit foo(x)
100000 loops, best of 3: 9.24 µs per loop
In [6]: %timeit foo1(x)
100000 loops, best of 3: 6.65 µs per loop
In [7]: def foo2(root):
...: return root.findall('./b')
...:
In [8]: def foo3(root):
...: return list(root.iterfind('./b'))
...:
In [9]: %timeit foo2(x)
100000 loops, best of 3: 8.54 µs per loop
In [10]: %timeit foo3(x)
100000 loops, best of 3: 8.4 µs per loop
关于python - xml.etree.ElementTree 的 findall() 和 iterfind() 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31043997/