2013-06-24 4 views
2

Я создаю сеть на python, используя пакеты numpy и сети. Вот код, который мне нужна помощь с:улучшить производительность python в networkx

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 держит 212000 строк

Как я новый на 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) время; возможно, список смежности (который реализован в качестве dict dicts в networkx) будет быстрее. В этом случае кто-нибудь знает о взвешенных графиках и списках смежности в networkx?

Сообщите мне, если вам нужна дополнительная информация, вся помощь будет полезна! ПРИМЕЧАНИЕ: На будущее: Как я могу узнать, разумен ли час?

+0

Вы пробовали профилировать его? http://pythonhosted.org/line_profiler/ –

+0

Попробуйте сначала вручную найти место узкого места. Это в 'nx.from_numpy_matrix()' или в цикле? – Bitwise

+0

Определенно 'nx.from_numpy_matrix()'. Он работает не более 10 секунд без этого утверждения. – CodeKingPlusPlus

ответ

4

Я не уверен, почему это происходит медленно при преобразовании матрицы 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