我想知道从单个节点开始“构建”无向图的最有效方法。
背景:
我正在使用一个api来返回看起来像这样的json对象(以非常简单的形式):
实施例1,
{
'Name': 'John',
'friends': ['Sally', 'Bob'],
}
例2
{
'Name': 'Sally',
'friends': ['John', 'Bob'],
}
实施例3
{
'Name': 'Bob',
'friends': ['Sally', 'John'],
}
假设我想在列表表示的字典中构建John的'网络'的无向图:
graph = {'John': ['Sally', 'Bob'],
'Sally': ['John', 'Bob'],
'Bob': ['Sally', 'John']
}
我创建了一个Person
类,以便更轻松地使用json对象:
class Person:
def __init__(self, name):
self.name = name
self.data = json.loads(requests.get(url+str(self.name)+url2).text)['results'] #this is basically the api call that gets the json object, url and url2 are just strings
def friends(self):
return self.data['friends']
,它有一个friends()
方法与json对象进行交互。调用Person('John').friends()
进行api调用,获取代表John的json对象并返回['Sally', 'Bob']
,即John的朋友列表。
由于这些json对象的结构,我可以通过好友列表继续递归来构建网络图。我的尝试:
def build_graph(name, adict, visited):
visited.append(name) #record that you've visited this person
adict[name] = Person(name).friends() #THIS IS AN API CALL. Create a dict entry where the key is the person's name and the value is their list of friends
for friend in adict[name]: #then for every friend of this person
if friend not in visited: #if I have not visited them
build_graph(friend, adict, visited) #continue building the graph
return adict #at the end return the graph
要使用它来获取John的网络图,您必须调用build_graph('John',{},[])
,即传递一个空的字典和列表,它可以从构建图形开始。
问题是build_graph
需要大约20秒来构建200个节点的图表。我不确定所有这些api调用是否是瓶颈,或者我是否只是写了这个函数。如何加快build_graph
?