高效的共同邻居和使用igraph的优先依恋

时间:2015-02-05 19:17:47

标签: python performance time-complexity igraph

我用python-igraph实现了一些相似性度量。特别常见的邻居和优先依恋。

最初我有这个:

#!/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)))

但我认为这是提高代码性能的一种方法。有没有人对如何提高此代码的性能有所了解?

1 个答案:

答案 0 :(得分:2)

预先将邻居集预先计算到邻接列表中,然后只使用邻接列表中的项而不是一遍又一遍地查询邻居。同样的事情也可以帮助学位计算,因为不需要调用方法,你可以从数组中查找学位:

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向量,然后将向量(作为列向量)与其转置相乘(即a行矢量)。结果是一个矩阵,其中包含所有节点对的度数乘积,然后循环在C而不是Python中完成。