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