这条线为什么需要这么长时间才能运行?
问题描述:
我有以下代码,它获取要排除的图和一组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%。 这是什么原因? 有没有办法让这段代码运行得更快?
答
你为什么在这里使用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)
这是因为你在'Graph.Nodes()创建每个项目的''chain'在第一种方法 – inspectorG4dget
那么,你必须创建链对象,并创建它具有非零成本。你到底在期待什么?同时处理更多处理器指令? –
在循环之外创建'chain'对象:) –