2016-12-05 26 views
0

我有一個對象是網絡設備對象的列表,因此它們具有名稱和方法(如connected_neighbors)等屬性。我想查找所有相互連接的對象來創建鏈接對象。我在做類似下面,但它正在變成很慢查找大型列表中的對象之間的連接

for ref_device in iter(devices): 
    for device in iter(devices): 
     if ref_dev.name in device.connected_neighbor_devices(): 
      print ref_dev.name + ' <--> ' + device.name 

更新: 我的數據是基本網絡設備對象的列表。這些對象是由json生成的,json本身代表這些網絡設備,它們的接口和這些接口上的鄰居。我有一個非常大的網絡設備對象列表,每個對象都有幾個接口。我想從這個名單裏的某個鏈接對象也有通過任意數量的接口連接兩個網絡設備對象創建鏈接對象(或基本上是彼此的鄰居)

我已經更新了我的代碼如下

class Link(object): 
    def __init__(self, dev_a, dev_b): 
     self.dev_a = dev_a 
     self.dev_b = dev_b 
    def __repr__(self): 
     return '{} - {}'.format(dev_a.name, dev_b.name) 

links = [] 
names = {dev.name for dev in devices} 
for ref_device in devices: 
for neigh in ref_device.connected_neighbor_devices(): 
    if neigh in names: 
     neigh_device = [d for d in devices if d.name == neigh][0] 
     links.append(Link(ref_device, neigh_device)) 
+0

附註:沒有理由顯式調用iter。 'for'循環隱式地在它們傳遞的迭代中調用'iter',所以當(快速)隱式調用不管發生什麼時,都只是在慢速顯式調用上浪費時間。 – ShadowRanger

+0

我們不知道您的數據以及數據如何連接。但是你不能從列表中刪除已經匹配的'ref_device'嗎?因此,循環運行時,「設備中的設備」循環越來越小。 –

+0

我的數據基本上是網絡設備對象的列表。這些對象是由json數據生成的,json數據本身代表這些網絡設備,它們的接口和這些接口上的鄰居。我有一個非常大的網絡設備對象列表,每個對象都有幾個接口。我想從這個列表創建鏈接對象,其中一個鏈接對象將有兩個網絡設備對象通過任意數量的接口連接(或基本上是彼此的鄰居) – zsh

回答

2

由於方法本身似乎獲得一系列連接的設備名稱,雙循環後接connected_neighbor_devices結果中的成員資格測試似乎沒有必要。當然,你可以這樣做:

names = {dev.name for dev in devices} 

for ref_device in devices: 
    for connected_name in ref_device.connected_neighbor_devices(): 
     if connected_name in names: 
      print ref_device.name + ' <--> ' + connected_name 

的,最初的set創建和測試的會員只是爲了確保連接的設備不是你devices藏品的一部分,不包括在輸出中。這可能與您現有代碼的排序不符,但如果需要可以更改;假設connected_neighbor_devices返回連接的設備的所有名稱,這應該得到你想要的,但O(n)調用和掃描結果從,而不是O(n ** 2)

+0

我認爲即使'''如果connected_name在名稱:'''不需要。 – wwii

+1

@wwii:如果'devices'覆蓋所有可能的連接設備,否則不需要。如果「設備」可能是所有可能設備的子集,並且您不想爲其他設備輸出,則需要進行測試。 – ShadowRanger

+0

看到我更新的代碼。這工作更快,但我現在有重複的鏈接。將嘗試修復此問題 – zsh