我正在处理Python程序中的树结构。 树中的每个节点都有一个字典“sons”,其键包含弧形信息和值 是儿子节点。问题是将节点列表传播给他们所有的儿子。 我用:
current_nodes = reduce(lambda s,x:s+x, map(lambda node:node.sons.values(),current_nodes),[])
其中current_nodes
是节点的初始(和更新)列表。
我的程序花费大部分时间执行此reduce操作。有没有更快的方法来实现它?
谢谢!
编辑:
嗨,只是让你知道代码:
sum((node.sons.values() for node in current_nodes), [])
虽然pythonic,但实际上并没有明显更快 - 如果是节点列表
如果长(> 20000),传播会不成比例地减慢,实际上非常慢。我不知道为什么。
然后我定义:
def Ext(nodes)
l=[]
for node in nodes:
l.extend(node.sons.values())
return l
然后我使用:current_node = Ext(current_node)
。
这种方法实际上要快得多。我想sum()函数在处理列表连接时不如列表的extend方法有效。
答案 0 :(得分:4)
from itertools import chain
list(chain.from_iterable(node.sons.values() for node in current_nodes))
应该更快。 map
上的reduce
和lambda
速度很慢。我不知道chain
有多快;你可以尝试
sum((node.sons.values() for node in current_nodes), [])
。