为什么这条线要走这么长时间?

2024-04-20 13:26:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码,它获取一个图和一组要排除的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%。 原因是什么? 有没有办法让这段代码运行得更快?你知道吗


Tags: to代码inidchain列表节点def
1条回答
网友
1楼 · 发布于 2024-04-20 13:26:00

为什么在这里使用chain?对于iterable,检查成员身份是O(n),必须为要检查的每个项重新创建该iterable。相反,可以预先创建一个set并使用它测试成员身份:

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

相关问题 更多 >