我正在使用包numpy
和网络在 python 中创建一个网络。这是我需要帮助的代码:
def create_rt_network(self):
"""construct a retweet network from twitter db"""
con = mdb.connect(**proper-information**)
cur = con.cursor(mdb.cursors.DictCursor)
cur.execute("select COUNT(*) from users")
N = cur.fetchone()['COUNT(*)']
mat = np.empty((N, N))
#read adjacency table and store data into mat
cur.execute("select * from adjacency")
rows = cur.fetchall()
for row in rows:
curRow = row['r']
curCol = row['c']
weight = row['val']
mat[curRow][curCol] = weight
cur.close()
con.close()
g = nx.from_numpy_matrix(mat, create_using=nx.DiGraph())
return g
事实:
- 创建此图表大约需要一个小时
- 表
adjacency
包含 212,000 行
由于我是 python 新手,我不知道解释器执行了多少优化(如果有的话)。无论如何,我认为错误实际上是在行中创建图形:
g = nx.from_numpy_matrix(mat, create_using=nx.DiGraph())
我相信这是因为:
- 我已经在没有那行的情况下运行了代码,而且速度很快(最多 10 秒)
- 我认为写作
mat
是 O(nlgn),因为我们有 n 行,从数据库中读取(btree 搜索)是 O(lgn),写作mat
是 O(1)。
我只是想到读取邻接矩阵需要 O(n^2) 时间;也许邻接列表(作为 dicts in 的 dict 实现networkx
)会更快。在那种情况下,有人知道networkx中的加权图和邻接表吗?
如果您想了解更多信息,请告诉我,非常感谢所有帮助! 注意:对于未来:我怎么知道一个小时是否合理?