我已閱讀this blog,它顯示了算法如何使用numpy提高250倍速度。我曾嘗試使用numpy的改善以下代碼,但我不能讓它工作:如何使用numpy提高python代碼性能
for i in nodes[1:]:
for lb in range(2, diameter+1):
not_valid_colors = set()
valid_colors = set()
for j in nodes:
if j == i:
break
if distances[i-1, j-1] >= lb:
not_valid_colors.add(c[j, lb])
else:
valid_colors.add(c[j, lb])
c[i, lb] = choose_color(not_valid_colors, valid_colors)
return c
說明
上面的代碼是用來計算自相似尺寸的算法的一部分一張圖。它基本上通過構建雙圖G'來工作,其中如果兩個圖之間的距離大於或等於給定值(Lb),則節點與其他節點相連,然後計算這些雙網上的圖着色。
該算法描述如下:
- 從1分配一個唯一的ID N到所有網絡節點,而不分配任何顏色愛好。
- 對於所有Lb的值,顏色值0分配給具有ID,IE C_1l
- 值= 1 = 0設置的ID I = 2。重複以下的節點,直到I = N.
- a)計算從i到網絡中所有節點的距離l_ij,id j小於i。 c)從l_ij≥Lb的所有節點j < i中選擇一個未使用的顏色C [j] [l_ij]。這是給定Lb值的節點i的顏色C [i] [Lb]。
- d)將Lb增加1並重復(c)直到Lb = Lb_max。
- e)通過1
我wrote it in python增加I,但它需要一分鐘以上時嘗試與具有100個節點和p = 0.9小型網絡中使用它。
因爲我還是新來的python和numpy,我沒有找到提高效率的方法。
是否可以通過使用numpy.where找到路徑比給定Lb更長的路徑來刪除循環?我試圖實現它,但沒有奏效...
但是在SO上比在CR上有更多'numpy'知識豐富的海報。 CR對問題格式也很挑剔。 '矢量化'是SO'numpy'的共同話題。 – hpaulj
'numpy'可以加速很多事情,如果你的問題在本質上是平行的 - 對一個元素做同樣的事情,不管順序如何。但如果問題是連續的 - 第i個元素的行爲取決於先前對'i-1'的行爲,那麼'numpy'通常不起作用。 – hpaulj
同意@hpaulj詢問表現,在此處向量化相關問題。同樣對於OP來說,如果代替集合,列表或甚至更好的情況下使用numpy數組,當查看向量化代碼時會更容易。 – Divakar