Calculate P50, P95, and P99 latency percentiles from a list of response times. Percentiles are critical for understanding the distribution of latencies in production systems.
import numpy as np
def calculate_percentiles(latencies: list[float]) -> dict:
latencies = np.array(latencies)
p50 = float(np.percentile(latencies, 50))
p95 = float(np.percentile(latencies, 95))
p99 = float(np.percentile(latencies, 99))
return {"p50": round(p50, 2), "p95": round(p95, 2), "p99": round(p99, 2)}
def percentile_from_scratch(latencies: list[float], p: float) -> float:
sorted_lat = sorted(latencies)
n = len(sorted_lat)
rank = (p / 100) * (n - 1)
lower = int(rank)
upper = min(lower + 1, n - 1)
frac = rank - lower
return sorted_lat[lower] + frac * (sorted_lat[upper] - sorted_lat[lower])