Code Profiling & Performance
Profiling identifies slow parts of your code. Use timeit, cProfile, and line_profiler to measure and optimize performance.
15 min•By Priygop Team•Updated 2026
Profiling
Profiling
import time
import cProfile
# Simple timing
def time_it(func, *args):
start = time.perf_counter()
result = func(*args)
elapsed = time.perf_counter() - start
print(f" {func.__name__}: {elapsed:.6f}s")
return result
# Compare approaches
def sum_loop(n):
total = 0
for i in range(n):
total += i
return total
def sum_builtin(n):
return sum(range(n))
def sum_formula(n):
return n * (n - 1) // 2
print("=== Performance Comparison ===")
n = 1_000_000
time_it(sum_loop, n)
time_it(sum_builtin, n)
time_it(sum_formula, n)
# List vs Generator
print("\n=== List vs Generator ===")
import sys
list_comp = [x**2 for x in range(10000)]
gen_exp = (x**2 for x in range(10000))
print(f" List: {sys.getsizeof(list_comp):>8} bytes")
print(f" Generator: {sys.getsizeof(gen_exp):>5} bytes")
# String concatenation comparison
def concat_plus(n):
s = ""
for i in range(n):
s += str(i)
return s
def concat_join(n):
return "".join(str(i) for i in range(n))
print("\n=== String Concat ===")
time_it(concat_plus, 10000)
time_it(concat_join, 10000)
# cProfile
print("\n=== cProfile Output ===")
cProfile.run('sum(range(100000))', sort='cumulative')Tip
Tip
Use timeit for micro-benchmarks and cProfile for finding bottlenecks. Optimize only after profiling — premature optimization is the root of all evil.
Diagram
Loading diagram…
asyncio for I/O. multiprocessing for CPU.
Common Mistake
Warning
Optimizing code without profiling first. You'll waste time on parts that don't matter. Profile to find the actual bottleneck.
Quick Quiz
Practice Task
Note
(1) Profile a slow function with cProfile. (2) Use timeit to compare two implementations. (3) Optimize based on profiling results.