<p>如文件所示-</p>
<ol>
<li><p><strong>findall</strong>返回与xpath匹配的元素的完整列表,我们可以使用下标来访问它们,例如-</p>
<pre><code>>>> 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>
</code></pre></li>
</ol>
<p>我们还可以使用for循环遍历列表。</p>
<ol start=“2”>
<li><strong>iterfind</strong>返回一个迭代器(生成器),它不返回列表,在这种情况下,我们不能使用下标来访问元素,我们只能在接受迭代器的地方使用它,例如for循环。</li>
</ol>
<p>如果您真的想遍历返回的列表(根据我的经验,大部分时间是这样),iterfind将比findall快,因为findall必须在返回之前创建完整的列表,而iterfind只在迭代和调用<code>next(iter)</code>时才找到(产生)与<code>match</code>匹配的下一个元素(这是使用<code>for</code>或此类构造遍历列表时在内部调用的元素)。</p>
<p>如果你想要这份名单,两人的时间似乎都差不多。</p>
<p>两种情况下的性能测试-</p>
<pre><code>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
</code></pre>