Ipaddress Module Complexity¶
The ipaddress module provides utilities for creating and manipulating IPv4 and IPv6 addresses and networks.
Common Operations¶
| Operation | Time | Space | Notes |
|---|---|---|---|
IPv4Address(addr) |
O(n) | O(1) | Create IPv4 address |
IPv6Address(addr) |
O(n) | O(1) | Create IPv6 address |
IPv4Network(addr) |
O(n) | O(1) | Create IPv4 network |
IPv6Network(addr) |
O(n) | O(1) | Create IPv6 network |
ip_address(addr) |
O(n) | O(1) | Auto-detect IP type |
ip_network(addr) |
O(n) | O(1) | Auto-detect network type |
| Address membership | O(1) | O(1) | Check in network |
| Subnet iteration | O(2^k) | O(1) | Generate subnets |
IP Address Creation¶
IPv4Address()¶
Time Complexity: O(n)¶
Where n = length of address string.
from ipaddress import IPv4Address
# Create from string: O(n) to parse
addr = IPv4Address('192.168.1.1') # O(n)
# Create from integer: O(1)
addr = IPv4Address(3232235777) # O(1)
# Access parts: O(1)
print(addr.packed) # Binary representation
print(addr.version) # 4
print(addr.is_private) # Check if private
Space Complexity: O(1)¶
from ipaddress import IPv4Address
addr = IPv4Address('10.0.0.1') # O(1) fixed size
IPv6Address()¶
Time Complexity: O(n)¶
from ipaddress import IPv6Address
# Create from string: O(n)
addr = IPv6Address('2001:db8::1') # O(n)
# Create from integer: O(1)
addr = IPv6Address(42540766411582592) # O(1)
# Compressed form: O(1)
print(addr.compressed) # '2001:db8::1'
Space Complexity: O(1)¶
from ipaddress import IPv6Address
addr = IPv6Address('::1') # O(1) fixed size
Network Operations¶
IPv4Network()¶
Time Complexity: O(n)¶
from ipaddress import IPv4Network
# Create network: O(n) to parse CIDR
network = IPv4Network('192.168.0.0/24') # O(n)
# Network properties: O(1)
print(network.network_address) # '192.168.0.0'
print(network.broadcast_address) # '192.168.0.255'
print(network.netmask) # '255.255.255.0'
print(network.num_addresses) # 256
# Check membership: O(1)
addr = IPv4Address('192.168.0.5')
if addr in network:
print("In network") # O(1)
Space Complexity: O(1)¶
from ipaddress import IPv4Network
network = IPv4Network('10.0.0.0/8') # O(1)
Iteration and Enumeration¶
Iterating Addresses¶
Time Complexity: O(n)¶
Where n = number of addresses.
from ipaddress import IPv4Network
network = IPv4Network('192.168.0.0/24')
# Iterate all addresses: O(n)
for addr in network: # O(256) for /24
print(addr)
# Iterate with limit: O(k) where k = limit
count = 0
for addr in network.hosts(): # Excludes network/broadcast - O(n-2)
if count >= 10:
break
count += 1
Space Complexity: O(1)¶
from ipaddress import IPv4Network
# Iterator uses O(1) space
for addr in network: # O(1) memory per iteration
process(addr)
Subnets¶
Time Complexity: O(2^k)¶
Where k = number of subnets.
from ipaddress import IPv4Network
network = IPv4Network('192.168.0.0/24')
# Split into subnets: O(2^k) where k = number of new subnets
subnets = list(network.subnets(new_prefix=25)) # O(2) for /24 -> /25
# [192.168.0.0/25, 192.168.0.128/25]
# Multiple levels: O(2^k)
subnets = list(network.subnets(new_prefix=26)) # O(4)
Space Complexity: O(2^k)¶
from ipaddress import IPv4Network
# Subnets list stored
subnets = list(network.subnets(new_prefix=25)) # O(2^k) space
Common Patterns¶
Check if Address is Private¶
from ipaddress import ip_address
def is_private(addr_str):
"""Check if address is private: O(n)"""
addr = ip_address(addr_str) # O(n) to parse
return addr.is_private # O(1)
# Usage
if is_private('10.0.0.1'):
print("Private network")
Find Supernet¶
from ipaddress import IPv4Network
def find_common_supernet(networks):
"""Find supernet containing all networks: O(n)"""
networks = [IPv4Network(n) for n in networks] # O(n)
supernet = IPv4Network.supernet_of(networks) # O(n)
return supernet
Parse Mixed Address Types¶
from ipaddress import ip_address, ip_network
def parse_address(addr_str):
"""Auto-detect and parse address: O(n)"""
try:
return ip_address(addr_str) # O(n) - IPv4 or IPv6
except ValueError:
return ip_network(addr_str) # O(n) - Network
Filter Addresses by Type¶
from ipaddress import IPv4Address, IPv6Address, ip_address
def filter_addresses(addresses):
"""Separate IPv4 and IPv6: O(n)"""
ipv4, ipv6 = [], []
for addr_str in addresses: # O(n)
addr = ip_address(addr_str) # O(m) where m = addr length
if addr.version == 4:
ipv4.append(addr)
else:
ipv6.append(addr)
return ipv4, ipv6 # O(n) total
Performance Characteristics¶
Best Practices¶
from ipaddress import IPv4Network, ip_address
# Good: Cache parsed addresses
addr = ip_address('192.168.1.1') # O(n) once
network = IPv4Network('192.168.0.0/24') # O(n)
for i in range(1000):
if addr in network: # O(1) reuse
process(addr)
# Good: Use helpers for auto-detection
addr = ip_address(user_input) # O(n) but handles both IPv4/6
# Avoid: Reparsing repeatedly
for i in range(1000):
addr = ip_address(addr_str) # O(n*1000)!
# Better: Parse once
addr = ip_address(addr_str) # O(n)
for i in range(1000):
use(addr) # O(1)
Large Network Iteration¶
from ipaddress import IPv4Network
# Good: Use hosts() for actual IPs
network = IPv4Network('10.0.0.0/8')
for host in network.hosts(): # Skips network/broadcast
process(host)
# Avoid: Iterating large networks
network = IPv4Network('10.0.0.0/8')
for addr in network: # 16 million iterations!
pass
Comparison with String Parsing¶
from ipaddress import IPv4Address
import socket
# ipaddress (structured)
addr = IPv4Address('192.168.1.1') # O(n)
is_private = addr.is_private # O(1)
# socket (string-based)
packed = socket.inet_aton('192.168.1.1') # O(n)
# More work needed for checks
# ipaddress is better for validation and network ops
Version Notes¶
- Python 3.3+: Full module support
- Python 3.10+: IPv6 scoping improvements
Related Documentation¶
- Socket Module - Low-level networking
- Urllib Module - URL handling
- Ssl Module - SSL/TLS support