[英]Finding connection between objects in a large list
我有一個網絡設備對象列表,因此它們具有諸如名稱之類的屬性和諸如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))
似乎沒有必要在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)
調用並掃描connected_neighbor_devices
的結果,而不是O(n ** 2)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.