Я создаю сеть на 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
Факты:
- Создание этого графика занимает около часа
- таблица
adjacency
держит 212000 строк
Как я новый на 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) время; возможно, список смежности (который реализован в качестве dict dicts в networkx
) будет быстрее. В этом случае кто-нибудь знает о взвешенных графиках и списках смежности в networkx?
Сообщите мне, если вам нужна дополнительная информация, вся помощь будет полезна! ПРИМЕЧАНИЕ: На будущее: Как я могу узнать, разумен ли час?
Вы пробовали профилировать его? http://pythonhosted.org/line_profiler/ –
Попробуйте сначала вручную найти место узкого места. Это в 'nx.from_numpy_matrix()' или в цикле? – Bitwise
Определенно 'nx.from_numpy_matrix()'. Он работает не более 10 секунд без этого утверждения. – CodeKingPlusPlus