首页 > 解决方案 > 在 python 中有效地对不同输入(不同大小)的函数进行基准测试

问题描述

我正在尝试对具有不同大小的不同输入的函数进行基准测试。

例如,我有一个函数something(array),它接受一个可变长度的 numpy 数组作为输入和一个可能的参数列表args = [np.random.rand(3, 2, i) for i in range(1,1000)]。我现在要做的是根据something输入测试时间需求。

我目前所做的如下:

def iterator(ys):

    times = []
    for i in range(len(ys)):
        start = timer()
        test = something(ys[i])
        end = timer()
        times.append(end - start)

    return times

有了这个,我得到了我想要的结果。问题是,使用这种方法,我没有得到任何关键数据,例如每个输入大小的方差或均值。我也可以做第二个循环,在其中运行iterator几次并使用结果来计算关键数据,但如果有的话,我宁愿使用已建立的方法。

我试图申请pytest-benchmarkhttps://pytest-benchmark.readthedocs.io/en/stable/),但无法找到将参数列表传递给函数的方法。

也许你们中的一些人对此有一个很好的解决方案!

标签: pythontestingpytestbenchmarking

解决方案


最方便的方法是使用 Ipython line magic%timeit或 cell magic执行时序测量%%timeit。我通常定义我想要测试的输入数据大小并在循环中运行它:

def list_search(lst, item):
    for el in lst:
        if el == item:
            return True
    return False

for n in (100, 1000, 10000, 100000):
    data = list(range(n)) 
    %timeit list_search(data, data[-1])

%timeit 函数需要一些参数来修改其行为:

%timeit [-n -r [-t|-c] -q -p<P> -o] 语句

选项: -n:在循环中执行给定语句的次数。如果未提供,则确定以获得足够的准确性。

-r:重复次数,每一次由循环组成,取最佳结果。默认值:7

(来自https://ipython.readthedocs.io/en/stable/interactive/magics.html


推荐阅读