2016-12-05 8 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から生成されます。私はいくつかのインターフェイスを持つネットワークデバイスオブジェクトの非常に大きなリストを持っています。私は

を次のように

が、私は自分のコードを更新している(お互いの隣人であるか、基本的に)リンクオブジェクトは、任意の数のインターフェイスを介して接続されている2つのネットワークデバイスオブジェクトを持つことになります。このリストからリンクオブジェクトを作成したいです

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 'ループは渡されたiterableに対して暗黙的に' iter'を呼び出します。なぜなら、(高速な)暗黙の呼び出しが何であっても発生しなければならないときは、(遅い)明示的な呼び出しで時間を無駄にしているだけです。 – ShadowRanger

+0

あなたのデータとデータがどのように接続されているかは分かりません。しかし、リストからすでに一致した 'ref_device'を削除できませんでしたか?したがって、 'デバイス内のデバイスのための'ループは、ループが実行されるにつれて小さくなります。 –

+0

私のデータは基本的にネットワークデバイスオブジェクトのリストです。これらのオブジェクトは、これらのネットワークデバイス、それらのインタフェース、およびこれらのインタフェース上のネイバーを表すjsonデータから生成されます。私はいくつかのインターフェイスを持つネットワークデバイスオブジェクトの非常に大きなリストを持っています。私はこのリストから、リンクオブジェクトに2つのネットワークデバイスオブジェクトを持つリンクオブジェクトを作成したいと考えています(または基本的には互いに隣り合っています) – 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)connected_neighbor_devicesではなくO(n ** 2)の結果を呼び出してスキャンします。

+0

名前が '' connected_name in '' '必要ない。 – wwii

+1

@wwii: 'devices'が接続可能なすべての接続デバイスをカバーしている場合、必要ありません。 'devices'がすべての可能なデバイスのサブセットであり、他のデバイスの出力を望まない場合は、テストが必要です。 – ShadowRanger

+0

私の更新されたコードを見てください。これはより速く動作していますが、今は重複するリンクがあります。これを修正しようとします – zsh

関連する問題