1. The range() Lazy Sequence Generator
O(1) Memory Regardless of Size
- In Python 3, `range(start, stop, step)` does not generate a list of numbers in memory; it returns a lazy range object.
- Memory consumption of `range(1_000_000)` is O(1) constant 48 bytes because numbers are generated on demand during iteration.
import sys
r1 = range(10)
r2 = range(10_000_000)
print("Size of range(10):", sys.getsizeof(r1), "bytes")
print("Size of range(10M):", sys.getsizeof(r2), "bytes")
💡 Key Takeaway: range() produces numbers on demand with O(1) memory footprint.