簡體   English   中英

在大列表中查找對象之間的連接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM