Python字典推导式运行效率优化咨询(XML minidom场景)
性能瓶颈原因
你当前实现慢的核心原因是做了大量无意义的重复计算:
- 现有写法是双层嵌套循环:外层遍历285个账号,内层每次都完整遍历1426条费用明细
- 累计会执行
285 * 1426 = 406410次getXMLDatum的XML节点查询,而minidom的DOM遍历接口本身开销较高,大量重复调用直接拉低了运行速度 - 本质是把O(M)就能做完的事(M为明细总数1426),做成了O(M*N)的时间复杂度(N为账号数285)
最优优化方案
核心逻辑是仅遍历一次费用明细列表,全程只对每条明细做一次账号查询,直接归类到对应账号的列表下,总查询次数直接降到1426次,性能可以提升200倍以上,预期运行时间会降到0.1秒级别。
实现代码如下:
# 第一步:预初始化所有账号对应的空列表,和你原推导式的初始结构完全一致 accountMap = {account: [] for account in accountNums} # 第二步:单次遍历所有费用明细,直接归类 for cd in chargeDetails: # 每条明细仅做一次XML节点查询,无重复调用 relate_acct = getXMLDatum(cd, "SECONDARY_ACCT") # 题目已明确所有明细都关联accountNums内的账号,无需额外判断key是否存在 accountMap[relate_acct].append(cd)
可选额外优化点
如果还想进一步压缩耗时,可以优化getXMLDatum函数的实现:当前函数调用getElementsByTagName会遍历节点下所有子节点找匹配标签,如果你明确SECONDARY_ACCT节点在DOM结构中的固定位置,可以直接通过节点索引取值,跳过全量子节点遍历的开销,示例:
# 假设SECONDARY_ACCT是cd节点下的第2个子节点(索引根据实际DOM结构调整),可以直接取值跳过查询 relate_acct = cd.childNodes[1].firstChild.nodeValue
注意:这个优化依赖固定的XML结构,如果XML结构可能变动不要使用,避免取值错误。
内容的提问来源于stack exchange,提问作者Matt Gracz
相关产品推荐
相关产品推荐

