Problems › Python › monitoring
The p95 of a batch of latencies
Dashboards quote p95 rather than the average, so one pathological request does not hide behind a thousand fast ones.
- Use the nearest-rank method: sort ascending, then take the value at position ceil(rank percent of the count), counting from 1.
- The rank is a percentage from 1 to 100; anything outside that gives 0.
- No readings gives 0.
percentile_value(values: list<int>, rank: int) → int
Where you start
def percentile_value(values: list[int], rank: int) -> int:
Worked examples
| Call | Result |
|---|---|
percentile_value([1, 2, 3, 4, 5], 50) | 3 |
percentile_value([1, 2, 3, 4, 5], 100) | 5 |
percentile_value([1, 2, 3, 4, 5], 1) | 1 |
percentile_value([10, 20, 30, 40, 50, 60, 70, 80, 90, 100], 95) | 100 |
Hint
In integers, ceil(rank * n / 100) is (rank * n + 99) / 100. Then subtract one for a zero-based index.
Reference solution in Python
def percentile_value(values: list[int], rank: int) -> int:
if not values or rank < 1 or rank > 100:
return 0
s = sorted(values)
pos = (rank * len(s) + 99) // 100
return s[pos - 1]