Нельзя вычитать time.perf_counter() из time.time(): это разные часы. Начальные минимумы и максимумы тоже неверны — ноль искажает результат для положительных или отрицательных значений.
def print_stats(func: Callable[[int], int], input_args: List[int]):
Нельзя вычитать time.perf_counter() из time.time(): это разные часы. Начальные минимумы и максимумы тоже неверны — ноль искажает результат для положительных или отрицательных значений.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
def print_stats(func: Callable[[int], int], input_args: List[int]): if not input_args: return
min_value_elapsed, min_value_result = 0, 0
max_value_elapsed, max_value_result = 0, 0
elapsed_sum = 0
result_sum = 0
counter = len(input_args)
for input_arg in input_args:
start = time.perf_counter()
result = func(input_arg)
elapsed = time.time() - start
min_value_elapsed = min(elapsed, min_value_elapsed)
max_value_elapsed = max(elapsed, max_value_elapsed)
elapsed_sum += elapsed
min_value_result = min(result, min_value_result)
max_value_result = max(result, max_value_result)
result_sum += result
print(
"Evaluation time min/avg/max: {}/{}/{}".format(
min_value_elapsed,
elapsed_sum / counter,
max_value_elapsed,
)
)
print(
"Result min/avg/max: {}/{}/{}".format(
min_value_result,
result_sum / counter,
max_value_result,
)
)
Ответ
Нельзя вычитать time.perf_counter() из time.time(): это разные часы. Начальные минимумы и максимумы тоже неверны — ноль искажает результат для положительных или отрицательных значений.
Используем один монотонный таймер и инициализируем экстремумы первым измерением. Каждый вызов функции учитывается один раз; исключение здесь прерывает сбор статистики.
import time
from typing import Callable, List
def print_stats(func: Callable[[int], int], input_args: List[int]):
if not input_args:
return
elapsed_sum = result_sum = 0
for index, arg in enumerate(input_args):
start = time.perf_counter()
result = func(arg)
elapsed = time.perf_counter() - start
if index == 0:
min_t = max_t = elapsed
min_r = max_r = result
else:
min_t, max_t = min(min_t, elapsed), max(max_t, elapsed)
min_r, max_r = min(min_r, result), max(max_r, result)
elapsed_sum += elapsed
result_sum += result
count = len(input_args)
print(f"Evaluation time min/avg/max: {min_t}/{elapsed_sum/count}/{max_t}")
print(f"Result min/avg/max: {min_r}/{result_sum/count}/{max_r}")
Дополнительная память O(1). Это измерение одного прогона, а не полноценный статистический benchmark.