2015-10-14 128 views
0

我有以下代码,它获取要排除的图和一组ID,并返回未出现在要排除的节点列表中的节点的ID。这条线为什么需要这么长时间才能运行?

我有两个版本的代码。一个获得两个列表,另一个获得一个列表。我正在使用itertools.chain来组合这两个列表。

from itertools import chain 

def GrapMinusNodes(Graph,nodes_to_exclude1,nodes_to_exclude2): 
    return (item.GetId() for item in Graph.Nodes() if item.GetId() not in chain(nodes_to_exclude1,nodes_to_exclude2)) 

和我有这样一个:

def GrapMinusNodes(Graph,nodes_to_exclude1,nodes_to_exclude2): 
    return (item.GetId() for item in Graph.Nodes() if item.GetId() not in nodes_to_exclude1) 

第一种方法的运行速度比所述第二个较慢的20%。 这是什么原因? 有没有办法让这段代码运行得更快?

+1

这是因为你在'Graph.Nodes()创建每个项目的''chain'在第一种方法 – inspectorG4dget

+3

那么,你必须创建链对象,并创建它具有非零成本。你到底在期待什么?同时处理更多处理器指令? –

+0

在循环之外创建'chain'对象:) –

回答

2

你为什么在这里使用chain?为迭代检查成员资格是O(n),并且您必须重新创建您要检查的每个项目的迭代。相反,使用预创建set和测试成员:

exclude = set().union(nodes_to_exclude1, nodes_to_exclude2) 
return (item.GetId() for item in Graph.Nodes() if item.GetId() not in exclude) 
相关问题