我有以下代码,它获取要排除的图形和一组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%。 这是什么原因? 有没有办法让这段代码运行得更快?
答案 0 :(得分:2)
为什么在这里使用chain
?对于iterable,检查成员资格为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)