joh*_*hao 5 python xml elementtree
我用下面的方式编写程序
from xml.etree.ElementTree import ET
xmlroot = ET.fromstring([my xml content])
for element in xmlroot.iterfind(".//mytag"):
do some thing
Run Code Online (Sandbox Code Playgroud)
它在我的python(v2.7.1)上工作正常,但在我将其复制到另一台安装了python v2.6.x的计算机后,iterfind()不支持,在python文档中,下面的描述列出
的findall(匹配)
按标签名称或路径查找所有匹配的子元素.返回包含文档顺序中所有匹配元素的列表.
iterfind(匹配)
按标签名称或路径查找所有匹配的子元素.返回一个iterable,以文档顺序生成所有匹配元素.
版本2.7中的新功能.
我的问题是:这两个功能是否相同?这两个功能有什么区别
如文档中所示 -
findall返回与matchxpath 匹配的完整元素列表,我们可以使用下标来访问它们,例如 -
>>> 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>
Run Code Online (Sandbox Code Playgroud)我们也可以使用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
Run Code Online (Sandbox Code Playgroud)
如果你这样做
for element in xmlroot.iterfind(".//mytag"):
do some thing
Run Code Online (Sandbox Code Playgroud)
然后将一次从 XML 文件中检索一个元素(每个循环一个元素)。
如果你这样做
for element in xmlroot.findall(".//mytag"):
do some thing
Run Code Online (Sandbox Code Playgroud)
所有元素将被一次检索并存储到(临时)列表中。只有这样for循环才会开始遍历该列表。
这意味着第二种方法在开始时需要更长的时间(因为它必须构建该列表)并使用更多内存(相同原因)。此外,如果您需要for在到达最后一个元素之前退出循环,您将做不必要的工作。另一方面,一旦进入for循环,第二种方法可能会更快一些。通常,第一种方法(“惰性求值”)的好处超过了这个缺点。
在您的情况下,切换到findall.
| 归档时间: |
|
| 查看次数: |
13156 次 |
| 最近记录: |