私は約200,000のIPアドレスのセットとフォーム(1.1.1.1/24)の10,000のサブネットを持っています。すべてのIPアドレスについて、これらのサブネットの1つに属しているかどうかを確認する必要がありますが、そのような大規模なデータセットであり、計算能力が低いので、これを効率的に実装したいと思います。与えられたIPアドレスがPythonのIPサブネットワークに属しているかどうかを効率的に調べる方法は?
from netaddr import IPNetwork, IPAddress
if IPAddress("192.168.0.1") in IPNetwork("192.168.0.0/24"):
print "Yay!"
しかし、私は、各アドレスループの10,000以上のサブネットをループにこの200,000以上のIPアドレスを持っており、以来、私はこの場合はわからない午前:検索について
は、私が見つけた一つの方法は、この(https://stackoverflow.com/a/820124/7995937)でした効率的です。 私の最初の疑問は、IPNetwork()の "IPAddress()"をリニアスキャンだけにチェックしているのですか、それとも何らかの方法で最適化されていますか?
私が思いついたもう一つの解決策は、IPサブネットに含まれるすべてのIP(重複することなく約13,000,000のIPになる)でリストを作成し、それを並べ替えることでした。私がこれを行うと、200,000のIPアドレスの私のループでは、より大きなIPアドレスのセットに対して、各IPのバイナリ検索を行うだけです。
for ipMasked in ipsubnets: # Here ipsubnets is the list of all subnets
setUnmaskedIPs = [str(ip) for ip in IPNetwork(ipMasked)]
ip_list = ip_list + setUnmaskedIPs
ip_list = list(set(ip_list)) # To eliminate duplicates
ip_list.sort()
私はその後、ちょうど次のようにバイナリ検索を実行できます。
for ip in myIPList: # myIPList is the list of 200,000 IPs
if bin_search(ip,ip_list):
print('The ip is present')
は、他のものよりもより効率的なこの方法ですか?または、このタスクを実行するための他の効率的な方法がありますか?
前述のように、最も速いのはセットを使用することです。それについてのその他のトピック: https://stackoverflow.com/questions/5993621/fastest-way-to-search-a-list-in-python –
IPv4文字列を32ビット整数に変換するのは簡単です私はおそらくintとバイナリ演算子を内部的に使用するようなライブラリを作成しなければなりませんでした。これはかなり効率的です。いつものように、最初に実際にパフォーマンスの問題があるかどうかを測定する必要があります。 – polku