在网络中提高python性能x
问题描述:
我正在使用软件包numpy
和网络在python中创建网络。这里是我需要帮助的代码:在网络中提高python性能x
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)次;也许一个邻接表(这是作为一个字典在networkx
dictts实施)会更快。在那种情况下,有没有人知道networkx中的加权图和邻接列表?
让我知道如果你想了解更多信息,所有帮助将不胜感激! 备注:未来:如何知道一小时是否合理?
答
我不知道为什么这是很慢时转换numpy矩阵为Di-Graph。请尝试下面的方法,看看它是否有帮助。
def create_directed_graph(rows):
g = nx.DiGraph()
for row in rows:
curRow = row['r']
curCol = row['c']
weight = row['val']
g.add_edge(curRow,curCol,Weight=weight)
return g
+0
这真是愚蠢!我是对的,因为读取邻接矩阵需要很长时间O(n^2)。 – CodeKingPlusPlus
您是否尝试过分析它? http://pythonhosted.org/line_profiler/ –
先尝试手动找到瓶颈所在。它在'nx.from_numpy_matrix()'还是循环? – Bitwise
肯定是'nx.from_numpy_matrix()'。没有这种说法,它最多运行10秒。 – CodeKingPlusPlus