Expert Python Tutorial: Understanding Generators

In Python, generators are a powerful tool for creating iterators in a more memory-efficient way. Unlike lists, which store all their values in memory, generators yield one value at a time, making them ideal for handling large datasets or streams of data.

What is a Generator?

A generator is a special type of iterator that allows you to iterate over a set of values without storing them in memory. Generators are created using functions and the yield keyword.

Creating a Generator

Here's a simple example of a generator function:

def simple_generator():
    yield 1
    yield 2
    yield 3

# Using the generator
gen = simple_generator()

for value in gen:
    print(value)        

Memory Efficiency

Generators are memory-efficient because they generate values on-the-fly and do not store them in memory. This makes them particularly useful for handling large datasets or infinite sequences.

Example: Fibonacci Sequence

Let's create a generator for the Fibonacci sequence:

def fibonacci_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# Using the Fibonacci generator
fib_gen = fibonacci_generator()

for _ in range(10):
    print(next(fib_gen))        

Memory Usage

To understand the memory usage, let's compare a list and a generator:

import sys

# List of numbers
numbers_list = [i for i in range(1000)]

# Generator for numbers
numbers_gen = (i for i in range(1000))

print("Size of list:", sys.getsizeof(numbers_list))
print("Size of generator:", sys.getsizeof(numbers_gen))        

Conclusion

Generators are a powerful feature in Python that can help you write more efficient and readable code. By using generators, you can handle large datasets and infinite sequences with ease.

To view or add a comment, sign in

More articles by Emmanuel Hadjistratis (he/him)

Explore content categories