首页 > 解决方案 > 改进 Python 中的多个 findall 执行

问题描述

findall我正在尝试改进我的 Python 代码中相同的多次执行(以下 for..loop 的 20 倍)的使用:

import xml.etree.ElementTree as etree

obj = etree.parse(...)
for goal in obj.findall('handle/goal'):
    for rule in goals.findall('rule'):
        ...

我已经做了一些改变。我现在在列表中执行相同的结果,并且可以重复使用该列表:

rule_list = []
for goal in obj.findall('handle/goal'):
    for rule in goal.findall('rule'):
        rule_list.append(rule)

现在我在所有 for..loops (~20 for..loops) 中使用这个 rule_list,比如:

for rule in rule_list:
    ...

现在,虽然我做了这些更改,但我并没有看到经过时间的大幅增长,只有 <5%。

所以,我想知道我还能做什么?我可以在 python 中使用哪些其他设计技术来加快速度?

  1. 解决方案 += :
    d0 = time.time()
    for goal in obj.findall('handle/goal'):
        rule_list += goal.findall('rule')
    dt = time.time() - d0
    print('time +=(findall): %0.4f' % dt)
    
    time +=(findall): 0.0019s
  1. 解决方案迭代/附加:
    d0 = time.time()
    for goal in obj.iter('handle/goal'):
        rule_list.append(goal.findall('rule'))
    dt = time.time() - d0
    print('time append(iter/findall): %0.4f' % dt)
    
    time append(iter/findall): 0.0089s
  1. 解决方案附加(两个 for..loops):
    d0 = time.time()
    for goal in obj.findall('handle/goal'):
        for rule in goal.findall('rule'):
            rule_list.append(rule)
    dt = time.time() - d0
    print('time append(findall): %0.4f' % dt)

    time append(findall): 0.0034s

因此,似乎第一个解决方案是迄今为止最快的解决方案。

标签: pythonxmlelementtree

解决方案


推荐阅读