为什么这条线需要这么长时间才能运行?

时间:2015-10-14 20:45:49

标签: python performance

我有以下代码,它获取要排除的图形和一组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 个答案:

答案 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)