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