从一个节点开始构建图形的最有效方法是什么?

时间:2014-11-02 16:30:33

标签: python json recursion social-networking

我想知道从单个节点开始“构建”无向图的最有效方法。

背景:

我正在使用一个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

0 个答案:

没有答案