Перцентили инференса после прогрева: задача Python

Первые вызовы модели могут сильно отличаться от последующих, поэтому в отчёте нужно отдельно обработать прогрев. Напишите функцию расчёта перцентилей по сохранённым замерам; способ интерполяции и порядок ответа полностью заданы в условии.

Откройте программу платного курса Computer Vision Engineer, чтобы продолжить практику с данными, моделями и CV-сервисом.

Перцентили задержки после прогрева

Задание

Напишите функцию latency(times, warmup, levels), которая превращает сырой журнал замеров в отчёт по перцентилям.

times — время вызовов в миллисекундах в том порядке, в каком они замерялись. Первые warmup значений — прогрев, они выбрасываются целиком. По оставшимся считается перцентиль для каждого уровня из levels; ответ возвращается списком в том же порядке, что и уровни.

Перцентиль считается с линейной интерполяцией, как это делает numpy. Оставшиеся замеры сортируются по возрастанию, для уровня берётся позиция , где — число замеров. Если позиция целая, ответ — значение на ней. Если нет, ответ лежит между соседними значениями пропорционально дробной части: значение слева плюс разность соседей, умноженная на эту дробную часть.

Уровни приходят числами от 0 до 100 и не обязательно по возрастанию. После прогрева остаётся хотя бы один замер.

Пример

times = [2503.0, 55.0, 26.0, 24.0, 22.0, 23.0, 22.5, 21.5]

latency(times, 3, [50, 95])  # [22.5, 23.8]

Три первых замера ушли в прогрев вместе с двухсекундным первым вызовом. Осталось пять значений, по возрастанию это 21.5, 22.0, 22.5, 23.0 и 24.0. Для p50 позиция равна 2 — ровно середина, ответ 22.5. Для p95 позиция 3.8: между 23.0 и 24.0, восемь десятых пути от первого ко второму.

Примечание

Журнал уже собран и приходит аргументом, замерять ничего не нужно. Стандартной библиотеки достаточно, numpy здесь недоступен. Возвращайте список чисел; вызывать функцию самостоятельно не нужно, тесты сделают это сами. Значения сравниваются с точностью до девятого знака, округлять результат не надо.

Что проверяется

Код проверок скрыт, так что вот полный список того, что в них разбирается:

  • формат ответа: список чисел по числу уровней;
  • пример из условия;
  • края шкалы: уровни 0 и 100;
  • прогрева нет — считаются все замеры;
  • после прогрева остался один замер: все уровни дают одно и то же значение;
  • дробная позиция между соседними замерами;
  • уровни идут не по возрастанию — порядок ответа повторяет порядок уровней;
  • все замеры одинаковые и вход, пришедший неотсортированным;
  • дубликаты значений после прогрева;
  • сто замеров подряд и длинный журнал, где двухсекундный первый вызов остался в прогреве.
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи