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
---------------------------------------------------------------------------------------------------------
Другие вопросы по тегам