import ipaddress
import socket
import struct
import timeit
iterations = int ( 1e4 )
benchmark = timeit .timeit ( """
n = ipaddress.ip_network('127.0.0.0/8')
""" , number= iterations, globals = globals ( ) )
time1 = timeit .timeit ( """
ipstr = str(ipaddress.ip_network('127.0.0.0/8').network_address)
parts = ipstr.split('.')
(int(parts[0]) << 24) + (int(parts[1]) << 16) + (int(parts[2]) << 8) + int(parts[3])
""" , number= iterations, globals = globals ( ) )
time1str = timeit .timeit ( """
ipstr = '127.0.0.0'
parts = ipstr.split('.')
(int(parts[0]) << 24) + (int(parts[1]) << 16) + (int(parts[2]) << 8) + int(parts[3])
""" , number= iterations, globals = globals ( ) )
time2 = timeit .timeit ( """
struct.unpack("!L", socket.inet_aton(str(ipaddress.ip_network('127.0.0.0/8').network_address)))[0] >> 24
""" , number= iterations, globals = globals ( ) )
time2str = timeit .timeit ( """
struct.unpack("!L", socket.inet_aton('127.0.0.0'))[0] >> 24
""" , number= iterations, globals = globals ( ) )
time3 = timeit .timeit ( """
int.from_bytes(map(int, str(ipaddress.ip_network('127.0.0.0/8').network_address).split('.')), 'big') >> 24
""" , number= iterations, globals = globals ( ) )
time3str = timeit .timeit ( """
int.from_bytes(map(int, '127.0.0.0'.split('.')), 'big') >> 24
""" , number= iterations, globals = globals ( ) )
time4 = timeit .timeit ( """
int(ipaddress.ip_network('127.0.0.0/8').network_address) >> 24
""" , number= iterations, globals = globals ( ) )
print ( "{:.4f} - Benchmark (time it takes to generate the ipaddress network object)" .format ( benchmark) )
print ( )
print ( "{:.4f} - Manually conversion (without ipaddress {:.4f})" .format ( time1, time1str) )
print ( "{:.4f} - socket & struct (without ipaddress {:.4f})" .format ( time2, time2str) )
print ( "{:.4f} - int.from_bytes([<ip segments>]) (without ipaddress {:.4f})" .format ( time3, time3str) )
print ( "{:.4f} - int(<ipaddress address object>)" .format ( time4) )
print ( )
print ( """
Conclusion:
If you are using the ipaddress module, the IP int is precaculated which
makes it the fastest. Otherwise, use the socket/struct method.
""" )
aW1wb3J0IGlwYWRkcmVzcwppbXBvcnQgc29ja2V0CmltcG9ydCBzdHJ1Y3QKaW1wb3J0IHRpbWVpdAogCml0ZXJhdGlvbnMgPSBpbnQoMWU0KQoKYmVuY2htYXJrID0gdGltZWl0LnRpbWVpdCgiIiIKbiA9IGlwYWRkcmVzcy5pcF9uZXR3b3JrKCcxMjcuMC4wLjAvOCcpCiIiIiwgbnVtYmVyPWl0ZXJhdGlvbnMsIGdsb2JhbHM9Z2xvYmFscygpKQp0aW1lMSA9IHRpbWVpdC50aW1laXQoIiIiCmlwc3RyID0gc3RyKGlwYWRkcmVzcy5pcF9uZXR3b3JrKCcxMjcuMC4wLjAvOCcpLm5ldHdvcmtfYWRkcmVzcykKcGFydHMgPSBpcHN0ci5zcGxpdCgnLicpCihpbnQocGFydHNbMF0pIDw8IDI0KSArIChpbnQocGFydHNbMV0pIDw8IDE2KSArIChpbnQocGFydHNbMl0pIDw8IDgpICsgaW50KHBhcnRzWzNdKQoiIiIsIG51bWJlcj1pdGVyYXRpb25zLCBnbG9iYWxzPWdsb2JhbHMoKSkKdGltZTFzdHIgPSB0aW1laXQudGltZWl0KCIiIgppcHN0ciA9ICcxMjcuMC4wLjAnCnBhcnRzID0gaXBzdHIuc3BsaXQoJy4nKQooaW50KHBhcnRzWzBdKSA8PCAyNCkgKyAoaW50KHBhcnRzWzFdKSA8PCAxNikgKyAoaW50KHBhcnRzWzJdKSA8PCA4KSArIGludChwYXJ0c1szXSkKIiIiLCBudW1iZXI9aXRlcmF0aW9ucywgZ2xvYmFscz1nbG9iYWxzKCkpCnRpbWUyID0gdGltZWl0LnRpbWVpdCgiIiIKc3RydWN0LnVucGFjaygiIUwiLCBzb2NrZXQuaW5ldF9hdG9uKHN0cihpcGFkZHJlc3MuaXBfbmV0d29yaygnMTI3LjAuMC4wLzgnKS5uZXR3b3JrX2FkZHJlc3MpKSlbMF0gPj4gMjQKIiIiLCBudW1iZXI9aXRlcmF0aW9ucywgZ2xvYmFscz1nbG9iYWxzKCkpCnRpbWUyc3RyID0gdGltZWl0LnRpbWVpdCgiIiIKc3RydWN0LnVucGFjaygiIUwiLCBzb2NrZXQuaW5ldF9hdG9uKCcxMjcuMC4wLjAnKSlbMF0gPj4gMjQKIiIiLCBudW1iZXI9aXRlcmF0aW9ucywgZ2xvYmFscz1nbG9iYWxzKCkpCnRpbWUzID0gdGltZWl0LnRpbWVpdCgiIiIKaW50LmZyb21fYnl0ZXMobWFwKGludCwgc3RyKGlwYWRkcmVzcy5pcF9uZXR3b3JrKCcxMjcuMC4wLjAvOCcpLm5ldHdvcmtfYWRkcmVzcykuc3BsaXQoJy4nKSksICdiaWcnKSA+PiAyNAoiIiIsIG51bWJlcj1pdGVyYXRpb25zLCBnbG9iYWxzPWdsb2JhbHMoKSkKdGltZTNzdHIgPSB0aW1laXQudGltZWl0KCIiIgppbnQuZnJvbV9ieXRlcyhtYXAoaW50LCAnMTI3LjAuMC4wJy5zcGxpdCgnLicpKSwgJ2JpZycpID4+IDI0CiIiIiwgbnVtYmVyPWl0ZXJhdGlvbnMsIGdsb2JhbHM9Z2xvYmFscygpKQp0aW1lNCA9IHRpbWVpdC50aW1laXQoIiIiCmludChpcGFkZHJlc3MuaXBfbmV0d29yaygnMTI3LjAuMC4wLzgnKS5uZXR3b3JrX2FkZHJlc3MpID4+IDI0CiIiIiwgbnVtYmVyPWl0ZXJhdGlvbnMsIGdsb2JhbHM9Z2xvYmFscygpKQoKCnByaW50KCJ7Oi40Zn0gLSBCZW5jaG1hcmsgKHRpbWUgaXQgdGFrZXMgdG8gZ2VuZXJhdGUgdGhlIGlwYWRkcmVzcyBuZXR3b3JrIG9iamVjdCkiLmZvcm1hdChiZW5jaG1hcmspKQpwcmludCgpCnByaW50KCJ7Oi40Zn0gLSBNYW51YWxseSBjb252ZXJzaW9uICh3aXRob3V0IGlwYWRkcmVzcyB7Oi40Zn0pIi5mb3JtYXQodGltZTEsIHRpbWUxc3RyKSkKcHJpbnQoIns6LjRmfSAtIHNvY2tldCAmIHN0cnVjdCAod2l0aG91dCBpcGFkZHJlc3MgezouNGZ9KSIuZm9ybWF0KHRpbWUyLCB0aW1lMnN0cikpCnByaW50KCJ7Oi40Zn0gLSBpbnQuZnJvbV9ieXRlcyhbPGlwIHNlZ21lbnRzPl0pICh3aXRob3V0IGlwYWRkcmVzcyB7Oi40Zn0pIi5mb3JtYXQodGltZTMsIHRpbWUzc3RyKSkKcHJpbnQoIns6LjRmfSAtIGludCg8aXBhZGRyZXNzIGFkZHJlc3Mgb2JqZWN0PikiLmZvcm1hdCh0aW1lNCkpCnByaW50KCkKcHJpbnQoIiIiCkNvbmNsdXNpb246CiAgICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBpcGFkZHJlc3MgbW9kdWxlLCB0aGUgSVAgaW50IGlzIHByZWNhY3VsYXRlZCB3aGljaAogICAgbWFrZXMgaXQgdGhlIGZhc3Rlc3QuICBPdGhlcndpc2UsIHVzZSB0aGUgc29ja2V0L3N0cnVjdCBtZXRob2QuCiIiIik=