python - xml.etree.ElementTree 的 findall() 和 iterfind() 有什么区别

标签 python xml elementtree

我用下面的方法写了一个程序

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.

我的问题是:这两个功能是否相同?这两个函数有什么区别

最佳答案

如文档中所示 -

  1. 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 循环来遍历列表。

  1. 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/

相关文章:

python - joblib 中的并行函数运行除函数之外的整个代码

java - 使用来自 java 的 javascript 的解析器 XML

android - 表现得像文本的 Xml View

c# - XML API 子项返回函数?

python - 注释掉并取消注释 xml 元素

python - lxml 中子元素文本值的 XPath

python - 正则表达式为??? (三个相邻的问号)用于 PyCharm 的代码标签

python - 根据最后一个数字对txt文档中的行进行排序

python - Django inspectdb 'unique_together' 指的是不存在的字段(2015)

python - 解析 XML 文件得到 UnicodeEncodeError (ElementTree)/ValueError (lxml)