如何将 timeit 用于多个值

How to use timeit for multiple values

我编写了一个使用 LU 分解求解线性方程 Ax=b 的代码,我被要求针对矩阵 A 的不同维度计算此方程的 运行 次。

我可以计算代码的 运行 时间,无论是对于给定的 A 和 b 还是对于不同维度的随机数,但我不确定如何为每个实现计算它的部分单一维度。我认为这可能是一个简单的 for 循环,但没有任何效果。

import timeit

setup = """
#function that solves the system
"""

repeats=5
result=timeit.timer('function', setup).timeit(number=repeats)/repeats

我也考虑过使用 timer.repeat,但它并没有真正意义,或者我只是不明白这对我有什么帮助。任何提示将不胜感激。

请注意:你需要使用 timeit.Timer 而不是 timeit.timer 否则你会得到 AttributeError: module 'timeit' has no attribute 'timer' 尽管你也可以使用 timeit.timeit 这对单身人士很有用使用计时。


我建议查看 How to use timeit module 以了解使用 timeit 模块的有效方法,特别是使用 from __main__ import 语法:

def function(stuff):
    NotImplemented

def setup():
    NotImplemented

setup_code = """
from __main__ import function, setup
data = setup() 
"""
func_code = "function(data)"

result = timeit.timeit(func_code,setup_code)

这样调用 setup 函数来生成基准测试所需的数据。因为它是一个函数,它还可以访问模块中的全局命名空间,所以它可以在其部分代码中使用在主程序中创建的信息:

import timeit

def function(stuff):
    NotImplemented

def setup():
    print("the setup_data is:",setup_data)

setup_code = """
from __main__ import function, setup
data = setup() 
"""
func_code = "function(data)"

for i in range(4):
    setup_data = i
    result = timeit.timeit(func_code,setup_code)
    print("result is",result)

因此,只需将 setup_data 定义为设置所需的数据(例如矩阵的维度),然后再 运行 宁 timeit.timeit 就可以了!


如果您想多次 运行 基准测试设置而不是每次设置,那么使用 repeat 而不是 timeit 是有意义的。

例如,假设您有一个排序算法,其速度取决于列表已经排序的程度。如果您只使用 timeit 结果可能会有很大差异,因为在设置后它每次都会使用相同的列表。您也不希望每次都生成一个列表,因为它会干扰实际的基准测试。

因此,在这种情况下,使用 repeat 对不同的列表进行排序而不包括基准测试中的列表创建是有意义的,此外,您还可以使用这些条目来查看 maxmin 次和平均值等