#!/usr/bin/env python3 # bench-python-igraph-0001.py # CWE-407: list-scan inside loop in python-igraph-0001 (generic model) # Models O(N*k) -> O(N+k) via linear-scan membership inside a loop vs set/dict. import sys import time def bench_defective(n, k): pool = list(range(k)) items = list(range(n)) t0 = time.perf_counter() seen = [] for x in items: if x not in pool: # O(k) seen.append(x) return time.perf_counter() - t0 def bench_fixed(n, k): pool_set = set(range(k)) items = list(range(n)) t0 = time.perf_counter() seen = [] for x in items: if x not in pool_set: # O(1) seen.append(x) return time.perf_counter() - t0 TRIALS = 3 CASES = [(100, 100), (500, 500), (1000, 1000), (2000, 2000)] def run(): lines = [] header = "=== python-igraph-0001: CWE-407: list-scan inside loop in python-igraph-0001 (generic model) ===" print(header); lines.append(header) for n, k in CASES: df = min(bench_defective(n, k) for _ in range(TRIALS)) fx = min(bench_fixed(n, k) for _ in range(TRIALS)) speedup = (df / fx) if fx > 0 else float("inf") line = f"N={n:<5} k={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" print(line); lines.append(line); sys.stdout.flush() return lines if __name__ == "__main__": run()