Optimization Techniques
1. Avoiding Full List Materialization
## Inefficient Approach
def process_data_list(data):
return [x * 2 for x in data]
## Optimized Generator Approach
def process_data_generator(data):
for item in data:
yield item * 2
Memory and Computation Flow
graph LR
A[Input Data] --> B[Generator]
B --> C[Transformation]
C --> D[Yield Result]
D --> E[Next Item]
Optimization Techniques
2. Generator Chaining
def filter_generator(gen, condition):
return (x for x in gen if condition(x))
def transform_generator(gen, transform_func):
return (transform_func(x) for x in gen)
3. Limiting Generator Size
| Technique |
Method |
Example |
itertools.islice() |
Limit iterations |
itertools.islice(generator, 100) |
take() function |
Custom limit |
list(take(100, generator)) |
4. Generator Comprehensions
## More memory-efficient than list comprehensions
squared_gen = (x**2 for x in range(1000))
Advanced Optimization Techniques
5. Coroutines and Generator Pipelines
def generator_pipeline():
def stage1():
for i in range(1000):
yield i
def stage2(source):
for item in source:
yield item * 2
def stage3(source):
for item in source:
if item % 2 == 0:
yield item
pipeline = stage3(stage2(stage1()))
return pipeline
from functools import partial
def multiplier(factor, x):
return x * factor
## Create specialized generator functions
double = partial(multiplier, 2)
triple = partial(multiplier, 3)
def optimized_generator(data, multiplier_func):
return (multiplier_func(x) for x in data)
Benchmarking Generators
import timeit
def list_comprehension():
return [x**2 for x in range(10000)]
def generator_comprehension():
return (x**2 for x in range(10000))
## Compare performance
list_time = timeit.timeit(list_comprehension, number=1000)
gen_time = timeit.timeit(generator_comprehension, number=1000)
Best Practices
- Use generators for large datasets
- Implement lazy evaluation
- Chain generators for complex transformations
- Limit generator size when possible
LabEx recommends mastering these optimization techniques for efficient Python programming.