如何将timeit用于多个值

时间:2016-02-17 19:05:13

标签: python timeit

我编写了一个代码,使用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,但它确实没有意义,或者我无法理解这对我有什么帮助。任何提示将不胜感激。

1 个答案:

答案 0 :(得分:0)

请注意:您需要使用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对不同的列表进行排序而不在基准测试中包含列表创建是有意义的,然后您可以使用这些条目来查看max或{{ 1}}次和平均等等。