【发布时间】:2011-11-05 08:05:34
【问题描述】:
我正在处理 Python 程序中的树结构。 树中的每个节点都有一个字典“儿子”,其键保存弧信息,值 是子节点。问题是将节点列表传播给他们所有的儿子。 我用:
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 方法高效。
【问题讨论】:
-
当
sum完成这项工作时,为什么你使用那个丑陋的reduce?和那个丑陋的map一样的东西:List comprehensionsFTW -
可以 sum 连接一个列表吗?
-
我明白了。 sum([node.sons.values() for node in current_nodes],[])
-
是的,
sum需要一个基本元素作为“累加器”(如果序列为空,那么非空序列的第一个元素不需要特殊处理),默认为0,但可以替换。要汇总列表,您只需从一个空列表开始。但是,sum会任意拒绝sum(['foo', 'bar', 'baz'], ''),并告诉你改用''.join成语。我个人认为这是 TSBOWTDI 的一个过分热心的应用 :( -
顺便说一句,“children”是此类数据成员的规范名称...