在网络中提高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 

事实:

  1. 创建该图需要一个小时左右
  2. adjacency持有212,000行

我作为新到python,我没有多少优化(如果有的话)解释器执行。无论如何,我认为错误是在该行实际创建的图形:

g = nx.from_numpy_matrix(mat, create_using=nx.DiGraph())

我相信这是因为:

  1. 我已经跑了代码,而该行并认为很快(在最多10秒)
  2. 我认为写作mat是O(nlgn),因为我们有n行,从数据库中读取(btree搜索)是O(lgn),而写入mat是O(1)。

我刚刚认为读取邻接矩阵需要O(n^2)次;也许一个邻接表(这是作为一个字典在networkx dictts实施)会更快。在那种情况下,有没有人知道networkx中的加权图和邻接列表?

让我知道如果你想了解更多信息,所有帮助将不胜感激! 备注:未来:如何知道一小时是否合理?

+0

您是否尝试过分析它? http://pythonhosted.org/line_profiler/ –

+0

先尝试手动找到瓶颈所在。它在'nx.from_numpy_matrix()'还是循环? – Bitwise

+0

肯定是'nx.from_numpy_matrix()'。没有这种说法,它最多运行10秒。 – CodeKingPlusPlus

我不知道为什么这是很慢时转换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