Я так поступал:
Преобразование IP из строки в целое:
IpInt = struct.unpack('!L',socket.inet_aton(IpStr))[0]
Преобразование IP из целого в строку:
IpStr = socket.inet_ntoa(struct.pack('!L', IpInt)
Оба используемых модуля стандратные, и сишные. Поетому преобразование - довольно быстрое ( на моей машине 10000 преобразований - за 0.01 сек).
Преобразование - взаимооднозначное. Скорость сравнение интов - думаю рулит, по сравнению со всеми прочими.
Инты пожно сравнивать напрямую и на больше, меньше:
print struct.unpack('!L',socket.inet_aton('0.0.0.0'))[0]
print struct.unpack('!L',socket.inet_aton('192.168.0.0'))[0]
print struct.unpack('!L',socket.inet_aton('192.168.0.1'))[0]
print struct.unpack('!L',socket.inet_aton('255.255.255.255'))[0]
--------------------------------------------------
0
3232235520
3232235521
4294967295