Python 基于igraph的有效公共邻域和优先依附

Python 基于igraph的有效公共邻域和优先依附,python,performance,time-complexity,igraph,Python,Performance,Time Complexity,Igraph,我正在用pythonigraph实现一些相似性度量。特别是共同的邻居和优先的依恋 最初,我有以下几点: #!/usr/bin/env python # encoding: utf-8 import igraph def preferential_attachment(g, i, j): return g.degree(i) * g.degree(j) def common_neighbors(g, i, j): return len(set(g.neighbors(i)).

我正在用pythonigraph实现一些相似性度量。特别是共同的邻居和优先的依恋

最初,我有以下几点:

#!/usr/bin/env python
# encoding: utf-8

import igraph

def preferential_attachment(g, i, j):
    return g.degree(i) * g.degree(j)

def common_neighbors(g, i, j):
    return len(set(g.neighbors(i)).intersection(g.neighbors(j)))

但我认为有一种方法可以提高代码性能。有人知道如何提高这段代码的性能吗?

预先将邻居集计算到邻接列表中,然后只使用邻接列表中的项目,而不是反复查询邻居。同样的事情也有助于度计算,因为不需要调用方法,您可以从数组中查找度:

class PrecalculatedStuff(object):
    def __init__(self, graph):
        self.graph = graph
        self.degrees = graph.degree()
        self.adjlist = map(set, graph.get_adjlist())

    def degree_product(self):
        return self.degrees[i] * self.degrees[j]

    def common_neighbors(self, i, j):
        return self.adjlist[i].intersection(self.adjlist[j])
此外,如果使用NumPy,则度的乘积可能更有效地进行计算-本质上是将度列表转换为NumPy向量,然后将向量(作为列向量)与其转置(即行向量)相乘。结果是一个矩阵,其中包含所有节点对的度积,然后使用C而不是Python完成循环