2016-09-28 6 views
1

私はpythons ipaddressモジュールを使用しています。使用可能なホストではなく、最初に使用可能なホストのみを取得しようとしています。python ipaddress、最初に使用可能なホストのみを取得しますか?

以下は私にすべてのホストを与えます。

は、他の方法で最初に使用可能なホストを取得することはできますか?以下

おかげ

n = ipaddress.ip_network(u'10.10.20.0/24') 
for ip in n.hosts(): 
... print ip 
10.10.20.1 
10.10.20.2 
10.10.20.3 
10.10.20.4 
... 
>>> for ip in n.hosts(): 
... print ip[1] 
... 
Traceback (most recent call last): 
    File "<console>", line 2, in <module> 
TypeError: 'IPv4Address' object does not support indexing 
>>> 

>>> print n.hosts()[0] 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
TypeError: 'generator' object has no attribute '__getitem__' 
+1

'ip'は既にリストの中の単一のIPです。あなたは' ip [1] 'が返すと思いますか? – Barmar

答えて

4

hosts()を失敗していると、インデックス作成をサポートしていないジェネレータオブジェクトを返します。あなたはそれを繰り返す必要があります。

あなたが最初の要素だけをしたい場合は、単にnext()を使用します。

n = ipaddress.ip_network(u'10.10.20.0/24') 
first_host = next(n.hosts()) 

あなたはインデックス作成をサポートしているリストにジェネレータオブジェクトを変換したい場合は、あなたがlist()関数を呼び出す必要があります:

all_hosts = list(n.hosts()) 
first_host = all_hosts[0] 

最初のコードスニペットと同様に、リストのようにジェネレータオブジェクトをループすることもできます。

for ip in n.hosts(): 
    # do something with ip: this is the IP address, so don't try to index into it! 
    pass 
+0

完璧!ありがとうございました – AlexW

0

特に「ビッグ・ネットワーク」のための最初のホストアドレスを取得する別の方法/小プレフィックスが値ではありません:

In [2]: ip_network("10.10.20.0/24")[1] 
Out[2]: IPv4Address('10.10.20.1') 

ですべてのホスト()ジェネレータを使用する必要はありません。例えば、 https://docs.python.org/3/library/ipaddress.html#networks-as-containers-of-addresses ipaddressについてネットワークオブジェクトは「アドレスのコンテナ」として扱われます。このアドレス空間内の最初のアドレス/「アドレスのコンテナ」はネットワークアドレス(インデックス[0])です。最後のアドレスはブロードキャストアドレス(index [-1])です。

それとも、1を追加することによって、最初のホストアドレスを取得&ネットワークアドレスを使用することができます。

In [4]: ip_network("10.10.20.0/24").network_address + 1 
Out[4]: IPv4Address('10.10.20.1') 

を使用しているプレフィックス/ネットマスクによっては、ホスト()ジェネレータが遅いすることができます。あなたは

list(ip_network("10.0.0.0/8").hosts()) 

を使用する場合ステートメントは2 **(32-8)でリストを作成 - 2 = 16777214のエントリ

私の時間であればこれなステートメントを、それがこのホストリストを作成する> 10秒必要があります。

In [11]: %time len(list(ip_network("10.0.0.0/8").hosts())) 
Wall time: 13.6 s 
Out[11]: 16777214 

私は最初のアドレスを取得するのに必要な時間を比較する場合:

In [15]: %time list(ip_network("10.0.0.0/8").hosts())[0] 
Wall time: 13.6 s 
Out[15]: IPv4Address('10.0.0.1') 
In [13]: %timeit -n10 -r5 ip_network("10.0.0.0/8")[1] 
10 loops, best of 5: 11.8 µs per loop 
In [17]: %timeit -n10 -r5 ip_network("10.0.0.0/8").network_address + 1 
10 loops, best of 5: 9.16 µs per loop 

結果:ホストが()約14 SEを必要とします完了するためにc。

In [19]: %timeit -n10 -r5 list(ip_network("10.0.0.0/24").hosts())[0] 
10 loops, best of 5: 135 µs per loop 

In [20]: %timeit -n10 -r5 ip_network("10.0.0.0/24").network_address + 1 
10 loops, best of 5: 9.32 µs per loop 
1

ショートバージョン:

import ipaddress 
net=ipaddress.ip_network(u'1.0.0.0/8') 
first=str(net[1]) 
last=str(net[-2]) 

ロングバージョン:

これは最初の計算の3つの方法を示す選択肢が+/- 10マイクロ秒

はtimeit/24のネットワークでありますipaddressを使用してCIDRブロックに最後に使用可能なIPアドレス を追加します。

と、それ以外の2つのホストイテレータを使用している は、古典的な宇宙時間のトレードオフを示しています。

import ipaddress 
import time 
import sys 

# 
# The fast, memory efficient way 
# 

start = time.time() 

net=ipaddress.ip_network(u'1.0.0.0/8') 
first=str(net[1]) 
last=str(net[-2]) 

stop = time.time() 
seconds=stop-start 
size=sys.getsizeof(net) 

print("First Host: %s, Last Host: %s, Seconds: %.4f, Size (Mb): %d" % (first,last, seconds, size/(1024**2))) 

# 
# Space efficient, but slow 
# 

start = time.time() 

net=ipaddress.ip_network(u'1.0.0.0/8') 
iterator=ipaddress.ip_network(u'1.0.0.0/8').hosts() 
first = last = next(iterator, None) 
for last in iterator: 
    pass 
first=str(first) 
last=str(last) 

stop = time.time() 
seconds=stop-start 
size=sys.getsizeof(net) 

print("First Host: %s, Last Host: %s, Seconds: %.4f, Size (Mb): %d" % (first,last, seconds, size/(1024**2))) 



# 
# Memory hog and slow, the worst of both worlds. 
# 

start = time.time() 

hosts=list(ipaddress.ip_network(u'1.0.0.0/8').hosts()) 
first_host=str(hosts[0]) 
last_host=str(hosts[-1]) 
size=sys.getsizeof(hosts) 

stop = time.time() 
seconds=stop-start 
print("First Host: %s, Last Host: %s, Seconds: %.4f, Size (Mb): %d" % (first,last, seconds, size/(1024**2))) 

First Host: 1.0.0.1, Last Host: 1.255.255.254, Seconds: 0.0000, Size (Mb): 0 
First Host: 1.0.0.1, Last Host: 1.255.255.254, Seconds: 8.0086, Size (Mb): 0 
First Host: 1.0.0.1, Last Host: 1.255.255.254, Seconds: 11.8096, Size (Mb): 132 
関連する問題