查找大型列表中对象之间的连接

时间:2016-12-05 22:28:27

标签: python

我有一个网络设备对象列表,因此它们具有名称和方法(如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))

1 个答案:

答案 0 :(得分: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)调用并扫描connected_neighbor_devices的结果,而不是O(n ** 2)。< / p>