python - 在 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-benchmark
(https://pytest-benchmark.readthedocs.io/en/stable/),但无法找到将参数列表传递给函数的方法。
也许你们中的一些人对此有一个很好的解决方案!
解决方案
最方便的方法是使用 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)
推荐阅读
- c - 计算和打印矩阵的对角线之和
- javascript - 如何在 Angular 中使用 addEventListener 和 postMessage?
- php - 如何将日期、时间和值从单选按钮放入数据库
- c# - 逐个像素地动态绘制和显示,有一些延迟
- npm - 如何从 Nexus oss 代理获取依赖于 github 项目的 npm 包
- django - Django 测试 - 发送包含整数的数组数组
- android - 在 android 中使用改造登录
- json - 我如何在 nunjuncks 中乘以数据?
- swift - 为什么不能在swift中将可变参数标记为inout?
- vue.js - Vue Js 2 / Vue-CLI 3 / 托管时显示空白页