perf-workshop/scenario2-memoization/config_validator_memoized.py
2026-01-10 19:50:13 +05:30

54 lines
1.3 KiB
Python

#!/usr/bin/env python3
"""
Memoized config validator - uses @lru_cache.
Profile this to see the lru_cache wrapper overhead.
Usage:
python3 config_validator_memoized.py
python3 -m cProfile -s tottime config_validator_memoized.py
"""
import time
from functools import lru_cache
from common import validate_rule_slow, load_events
@lru_cache(maxsize=None)
def validate_rule_cached(rule_id, event_type):
"""Same validation but with caching."""
return validate_rule_slow(rule_id, event_type)
def process_events(events):
"""Process events using memoized validation."""
valid_count = 0
for rule_id, event_type, data in events:
if validate_rule_cached(rule_id, event_type):
valid_count += 1
return valid_count
ITERATIONS = 5
def main():
events = load_events()
print(f"Processing {len(events)} events (memoized), {ITERATIONS} iterations...")
times = []
for i in range(ITERATIONS):
if i == 0:
validate_rule_cached.cache_clear() # Cold start on first run
start = time.perf_counter()
valid_count = process_events(events)
times.append(time.perf_counter() - start)
avg = sum(times) / len(times)
print(f"Valid: {valid_count}")
print(f"Avg time: {avg:.3f}s")
if __name__ == "__main__":
main()