Повышение производительности Binomial-Grid NetworkX в Python - PullRequest
0 голосов
/ 26 марта 2020

Я реализовал этот фрагмент кода, найденный в Yuxing Yan Python для Finance 2nd edition, и столкнулся с некоторыми проблемами с производительностью при создании биномиальных сеток с максимум 5000 узлами (ie около 100 периодов в дереве) с метками .

import networkx as nx
def binomial_grid(n):
G = nx.Graph()
for i in range(0, n + 1):
    for j in range(1, i + 2):
        if i < n:
            G.add_edge((i, j), (i + 1, j))
            G.add_edge((i, j), (i + 1, j + 1))

posG = {}
for node in G.nodes():
    posG[node] = (node[0], n + 2 + node[0] - 2 * node[1])

nx.draw(G, pos=posG)
plt.show()

В настоящее время я использую встроенную функцию networkX:

nx.draw_networkx_labels(G, posG, labels=labels)

, чтобы добавить метки к узлам. Метки являются словарями, где ключи - это кортеж (ie узлы) и строки значений. Например:

{(0, 1): '-6.45,-6.45', (1, 1): '-6.46,-7.48', (1, 2): '-6.46,-5.54', ..., }

Я прочитал, что networkX полностью закодирован в python и поэтому сталкивается с некоторыми проблемами с производительностью, но, учитывая мое использование (максимально, я построю 5000 узлов), я сомневаюсь, что это нормально. На моем компьютере требуется около 25 секунд, чтобы построить график с метками, и даже при увеличении масштаба он становится запаздывающим на графике matplotlib.

Думаю, это может быть связано с тем, что реализация книги не очень оптимизирована? Но я не уверен.

Можно ли улучшить его?

ограничение: отображать метки на узлах, и то, что я уже пробовал: изменение типа значений с строкового на плавающее, ничего удивительного не изменило.

Спасибо

...