Pytest-benchmark: предварительное вычисление тестовых данных
Не могли бы вы сказать мне, является ли предварительный расчет тестовых входных данных в том же скрипте допустимым подходом, и не повлияет ли это на процедуру бенчмаркинга (т.е. на время)?
например, вscript.py
def compute_inputs():
#some computations
#return inputs
INPUTS = compute_inputs()
def something(some_arg):
# code to be benchmarked
def test_my_stuff(benchmark):
# benchmark something
result = benchmark(something)
А затем запустите его следующим образом:
pytest script.py
Спасибо за любой вклад.
1 ответ
TLDR; Согласно pytest-benchmark, он оценивает только вызываемый объект, который вы ему передаете. Таким образом, теоретически любые переменные, которые вы предварительно вычислили перед вызовом функции, которую вы тестируете, не повлияют на результат (время).документации
Мы можем сделать пример и увидеть его на практике:
def something():
time.sleep(1)
return 123
def test_my_stuff(benchmark):
result = benchmark(something)
assert result == 123
Приведенный выше пример спит в течение 1 секунды, поэтому мы ожидаем, что время выполнения будет примерно таким. И время выполнения действительно ~ 1 секунда:
------------------------------------------- benchmark: 1 tests ------------------------------------------
Name (time in s) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
---------------------------------------------------------------------------------------------------------
test_my_stuff 1.0005 1.0050 1.0031 0.0019 1.0028 0.0032 1;0 0.9969 5 1
---------------------------------------------------------------------------------------------------------
Теперь давайте попробуем случай, когда мы предварительно вычисляем некоторые значения:
def compute_inputs():
time.sleep(1)
return 123
INPUT = compute_inputs()
def something():
time.sleep(1)
return INPUT
def test_my_stuff(benchmark):
result = benchmark(something)
assert result == 123
Здесь мы можем рассматривать как предварительно вычисленный ввод. Требуется одна секунда, чтобы произвестиINPUT
, поэтому мы можем ожидать, что общее время выполнения составит 2 секунды. Но, как вы можете видеть в выводе, pytest-benchmark игнорирует этот предварительный расчет и подсчитывает только вызываемые объекты, которые выполняются внутриbenchmark
приспособление:
------------------------------------------- benchmark: 1 tests ------------------------------------------
Name (time in s) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
---------------------------------------------------------------------------------------------------------
test_my_stuff 1.0008 1.0050 1.0030 0.0019 1.0038 0.0033 2;0 0.9970 5 1
---------------------------------------------------------------------------------------------------------