Python 基于igraph的有效公共邻域和优先依附
我正在用pythonigraph实现一些相似性度量。特别是共同的邻居和优先的依恋 最初,我有以下几点: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)).
#!/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完成循环